From 20cf8fa6ad75ca61606254f3997d6508a10b6dc0 Mon Sep 17 00:00:00 2001 From: lizzie Date: Sat, 18 Oct 2025 20:31:48 +0000 Subject: [PATCH] no aliases, fix type util Signed-off-by: lizzie --- src/dynarmic/src/dynarmic/CMakeLists.txt | 2 +- .../backend/arm64/a32_address_space.cpp | 2 +- .../backend/arm64/a64_address_space.cpp | 2 +- .../dynarmic/backend/arm64/address_space.cpp | 2 +- .../emit_arm64_vector_floating_point.cpp | 2 +- .../src/dynarmic/backend/x64/block_of_code.h | 2 +- .../backend/x64/emit_x64_floating_point.cpp | 52 +++++++------------ .../backend/x64/emit_x64_memory.cpp.inc | 6 +-- .../backend/x64/emit_x64_saturation.cpp | 5 +- .../x64/emit_x64_vector_floating_point.cpp | 35 +++++++------ src/dynarmic/src/dynarmic/common/cast_util.h | 18 ------- src/dynarmic/src/dynarmic/common/fp/util.h | 10 ---- src/dynarmic/src/dynarmic/common/type_util.h | 28 ++++++++++ 13 files changed, 77 insertions(+), 89 deletions(-) delete mode 100644 src/dynarmic/src/dynarmic/common/cast_util.h create mode 100644 src/dynarmic/src/dynarmic/common/type_util.h diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index 3bc5e4714d..cb10b6b168 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -8,7 +8,7 @@ add_library(dynarmic STATIC backend/exception_handler.h common/assert.cpp common/assert.h - common/cast_util.h + common/type_util.h common/common_types.h common/crypto/aes.cpp common/crypto/aes.h diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp index 499b663af9..681efce984 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a32_address_space.cpp @@ -13,7 +13,7 @@ #include "dynarmic/backend/arm64/devirtualize.h" #include "dynarmic/backend/arm64/emit_arm64.h" #include "dynarmic/backend/arm64/stack_layout.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/frontend/A32/a32_location_descriptor.h" #include "dynarmic/frontend/A32/translate/a32_translate.h" diff --git a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp index c4195b6af2..f79f0ea374 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/a64_address_space.cpp @@ -13,7 +13,7 @@ #include "dynarmic/backend/arm64/devirtualize.h" #include "dynarmic/backend/arm64/emit_arm64.h" #include "dynarmic/backend/arm64/stack_layout.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/frontend/A64/a64_location_descriptor.h" #include "dynarmic/frontend/A64/translate/a64_translate.h" #include "dynarmic/interface/A64/config.h" diff --git a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp index c31c6d16d8..fc701284b7 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/address_space.cpp @@ -13,7 +13,7 @@ #include "dynarmic/backend/arm64/devirtualize.h" #include "dynarmic/backend/arm64/emit_arm64.h" #include "dynarmic/backend/arm64/stack_layout.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/llvm_disassemble.h" #include "dynarmic/interface/exclusive_monitor.h" diff --git a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index 4ab4f6b165..e9efe38103 100644 --- a/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -23,7 +23,7 @@ #include "dynarmic/backend/arm64/emit_context.h" #include "dynarmic/backend/arm64/fpsr_manager.h" #include "dynarmic/backend/arm64/reg_alloc.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/fp/info.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h index 095e75336b..42e5fb0982 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.h @@ -23,7 +23,7 @@ #include "dynarmic/backend/x64/constant_pool.h" #include "dynarmic/backend/x64/host_feature.h" #include "dynarmic/backend/x64/jitstate_info.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/interface/halt_reason.h" #include "dynarmic/ir/cond.h" diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp index 4fc2535f09..934f7175e3 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_floating_point.cpp @@ -24,7 +24,7 @@ #include "dynarmic/backend/x64/block_of_code.h" #include "dynarmic/backend/x64/constants.h" #include "dynarmic/backend/x64/emit_x64.h" -#include "dynarmic/common/cast_util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/common/fp/fpcr.h" #include "dynarmic/common/fp/fpsr.h" #include "dynarmic/common/fp/info.h" @@ -35,22 +35,8 @@ #include "dynarmic/ir/basic_block.h" #include "dynarmic/ir/microinstruction.h" -#define FCODE(NAME) \ - [&code](auto... args) { \ - if (fsize == 32) { \ - code.NAME##s(args...); \ - } else { \ - code.NAME##d(args...); \ - } \ - } -#define ICODE(NAME) \ - [&code](auto... args) { \ - if (fsize == 32) { \ - code.NAME##d(args...); \ - } else { \ - code.NAME##q(args...); \ - } \ - } +#define FCODE(NAME) [&](auto... args) { if (fsize == 32) code.NAME##s(args...); else code.NAME##d(args...); } +#define ICODE(NAME) [&](auto... args) { if (fsize == 32) code.NAME##d(args...); else code.NAME##q(args...); } namespace Dynarmic::Backend::X64 { @@ -204,7 +190,7 @@ void PostProcessNaN(BlockOfCode& code, Xbyak::Xmm result, Xbyak::Xmm tmp) { // We allow for the case where op1 and result are the same register. We do not read from op1 once result is written to. template void EmitPostProcessNaNs(BlockOfCode& code, Xbyak::Xmm result, Xbyak::Xmm op1, Xbyak::Xmm op2, Xbyak::Reg64 tmp, Xbyak::Label end) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT exponent_mask = FP::FPInfo::exponent_mask; constexpr FPT mantissa_msb = FP::FPInfo::mantissa_msb; constexpr u8 mantissa_msb_bit = static_cast(FP::FPInfo::explicit_mantissa_width - 1); @@ -279,7 +265,7 @@ void FPTwoOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { if (!ctx.FPCR().DN() && !ctx.HasOptimization(OptimizationFlag::Unsafe_InaccurateNaN)) { end = ProcessNaN(code, ctx, result); } - if (std::is_member_function_pointer_v) { + if constexpr (std::is_member_function_pointer_v) { (code.*fn)(result, result); } else { fn(result); @@ -298,7 +284,7 @@ void FPTwoOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { template void FPThreeOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -306,7 +292,7 @@ void FPThreeOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) const Xbyak::Xmm result = ctx.reg_alloc.UseScratchXmm(args[0]); const Xbyak::Xmm operand = ctx.reg_alloc.UseScratchXmm(args[1]); - if (std::is_member_function_pointer_v) { + if constexpr (std::is_member_function_pointer_v) { (code.*fn)(result, operand); } else { fn(result, operand); @@ -328,7 +314,7 @@ void FPThreeOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) SharedLabel end = GenSharedLabel(), nan = GenSharedLabel(); code.movaps(result, op1); - if (std::is_member_function_pointer_v) { + if constexpr (std::is_member_function_pointer_v) { (code.*fn)(result, op2); } else { fn(result, op2); @@ -357,7 +343,7 @@ void FPThreeOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, Function fn) template void FPAbs(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT non_sign_mask = FP::FPInfo::sign_mask - FPT(1u); auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -383,7 +369,7 @@ void EmitX64::EmitFPAbs64(EmitContext& ctx, IR::Inst* inst) { template void FPNeg(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT sign_mask = FP::FPInfo::sign_mask; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -473,7 +459,7 @@ static void EmitFPMinMax(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { template static inline void EmitFPMinMaxNumeric(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) noexcept { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT default_nan = FP::FPInfo::DefaultNaN(); auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -625,7 +611,7 @@ void EmitX64::EmitFPMul64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; const auto fallback_fn = negate_product ? &FP::FPMulSub : &FP::FPMulAdd; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -852,7 +838,7 @@ void EmitX64::EmitFPMulSub64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPMulX(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -912,7 +898,7 @@ void EmitX64::EmitFPMulX64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPRecipEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; if (fsize != 16) { if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) { @@ -958,7 +944,7 @@ void EmitX64::EmitFPRecipEstimate64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPRecipExponent(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); ctx.reg_alloc.HostCall(inst, args[0]); @@ -981,7 +967,7 @@ void EmitX64::EmitFPRecipExponent64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPRecipStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -1118,7 +1104,7 @@ void EmitX64::EmitFPRoundInt64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; if (fsize != 16) { if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) { @@ -1297,7 +1283,7 @@ void EmitX64::EmitFPRSqrtEstimate64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPRSqrtStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -1601,7 +1587,7 @@ void EmitX64::EmitFPDoubleToSingle(EmitContext& ctx, IR::Inst* inst) { /// Better than spamming thousands of templates aye? template static u64 EmitFPToFixedThunk(u64 input, FP::FPSR& fpsr, FP::FPCR fpcr, u32 extra_args) { - using FPT = mcl::unsigned_integer_of_size; + using FPT = FP::UnsignedIntegerN; auto const unsigned_ = ((extra_args >> 24) & 0xff) != 0; auto const isize = ((extra_args >> 16) & 0xff); auto const rounding = FP::RoundingMode((extra_args >> 8) & 0xff); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc index 6b51eb501c..8322ab11d8 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.cpp.inc @@ -4,7 +4,7 @@ */ #include -#include "dynarmic/common/fp/util.h" +#include "dynarmic/common/type_util.h" #define AxxEmitX64 CONCATENATE_TOKENS(Axx, EmitX64) #define AxxEmitContext CONCATENATE_TOKENS(Axx, EmitContext) @@ -224,7 +224,7 @@ void AxxEmitX64::EmitExclusiveReadMemory(AxxEmitContext& ctx, IR::Inst* inst) { const bool ordered = IsOrdered(args[2].GetImmediateAccType()); if constexpr (bitsize != 128) { - using T = FP::UnsignedIntegerN; + using T = Common::UnsignedIntegerN; ctx.reg_alloc.HostCall(inst, {}, args[1]); @@ -291,7 +291,7 @@ void AxxEmitX64::EmitExclusiveWriteMemory(AxxEmitContext& ctx, IR::Inst* inst) { code.mov(code.byte[code.ABI_JIT_PTR + offsetof(AxxJitState, exclusive_state)], u8(0)); code.mov(code.ABI_PARAM1, reinterpret_cast(&conf)); if constexpr (bitsize != 128) { - using T = FP::UnsignedIntegerN; + using T = Common::UnsignedIntegerN; code.CallLambda( [](AxxUserConfig& conf, Axx::VAddr vaddr, T value) -> u32 { diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp index 50f5161564..84eae8c02a 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_saturation.cpp @@ -18,6 +18,7 @@ #include "dynarmic/ir/microinstruction.h" #include "dynarmic/ir/opcodes.h" #include "dynarmic/common/fp/util.h" +#include "dynarmic/common/type_util.h" namespace Dynarmic::Backend::X64 { @@ -38,7 +39,7 @@ void EmitSignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) Xbyak::Reg addend = ctx.reg_alloc.UseGpr(args[1]).changeBit(size); Xbyak::Reg overflow = ctx.reg_alloc.ScratchGpr().changeBit(size); - constexpr u64 int_max = static_cast((std::numeric_limits>::max)()); + constexpr u64 int_max = static_cast((std::numeric_limits>::max)()); if constexpr (size < 64) { code.xor_(overflow.cvt32(), overflow.cvt32()); code.bt(result.cvt32(), size - 1); @@ -82,7 +83,7 @@ void EmitUnsignedSaturatedOp(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst Xbyak::Reg op_result = ctx.reg_alloc.UseScratchGpr(args[0]).changeBit(size); Xbyak::Reg addend = ctx.reg_alloc.UseScratchGpr(args[1]).changeBit(size); - constexpr u64 boundary = op == Op::Add ? (std::numeric_limits>::max)() : 0; + constexpr u64 boundary = op == Op::Add ? (std::numeric_limits>::max)() : 0; if constexpr (op == Op::Add) { code.add(op_result, addend); diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp index dcf2cbc832..adf112d335 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector_floating_point.cpp @@ -30,6 +30,7 @@ #include "dynarmic/common/fp/info.h" #include "dynarmic/common/fp/op.h" #include "dynarmic/common/fp/util.h" +#include "dynarmic/common/type_util.h" #include "dynarmic/common/lut_from_list.h" #include "dynarmic/interface/optimization_flags.h" #include "dynarmic/ir/basic_block.h" @@ -75,7 +76,7 @@ void MaybeStandardFPSCRValue(BlockOfCode& code, EmitContext& ctx, bool fpcr_cont template class Indexer, size_t narg> struct NaNHandler { public: - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; using function_type = void (*)(std::array, narg>&, FP::FPCR); @@ -157,33 +158,33 @@ Xbyak::Address GetVectorOf(BlockOfCode& code) { template Xbyak::Address GetNaNVector(BlockOfCode& code) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; return GetVectorOf::DefaultNaN()>(code); } template Xbyak::Address GetNegativeZeroVector(BlockOfCode& code) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; return GetVectorOf::Zero(true)>(code); } template Xbyak::Address GetNonSignMaskVector(BlockOfCode& code) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT non_sign_mask = FP::FPInfo::exponent_mask | FP::FPInfo::mantissa_mask; return GetVectorOf(code); } template Xbyak::Address GetSmallestNormalVector(BlockOfCode& code) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT smallest_normal_number = FP::FPValue::exponent_min, 1>(); return GetVectorOf(code); } -template value> +template value> Xbyak::Address GetVectorOf(BlockOfCode& code) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; return GetVectorOf()>(code); } @@ -1084,7 +1085,7 @@ static void EmitFPVectorMinMaxNumeric(BlockOfCode& code, EmitContext& ctx, IR::I if (code.HasHostFeature(HostFeature::AVX)) { MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; // result = xmm_a == SNaN || xmm_b == QNaN { @@ -1157,7 +1158,7 @@ static void EmitFPVectorMinMaxNumeric(BlockOfCode& code, EmitContext& ctx, IR::I } MaybeStandardFPSCRValue(code, ctx, fpcr_controlled, [&] { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; // result = xmm_a == SNaN || xmm_b == QNaN { @@ -1313,7 +1314,7 @@ static void EmitFPVectorMulAddFallback(VectorArray& result, const VectorArr template void EmitFPVectorMulAdd(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; const auto fallback_fn = [](VectorArray& result, const VectorArray& addend, const VectorArray& op1, const VectorArray& op2, FP::FPCR fpcr, FP::FPSR& fpsr) { for (size_t i = 0; i < result.size(); i++) { @@ -1424,7 +1425,7 @@ void EmitX64::EmitFPVectorMulAdd64(EmitContext& ctx, IR::Inst* inst) { template static void EmitFPVectorMulX(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; auto args = ctx.reg_alloc.GetArgumentInfo(inst); const bool fpcr_controlled = args[2].GetImmediateU1(); @@ -1490,7 +1491,7 @@ void EmitX64::EmitFPVectorMulX64(EmitContext& ctx, IR::Inst* inst) { template void FPVectorNeg(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; constexpr FPT sign_mask = FP::FPInfo::sign_mask; auto args = ctx.reg_alloc.GetArgumentInfo(inst); @@ -1543,7 +1544,7 @@ void EmitX64::EmitFPVectorPairedAddLower64(EmitContext& ctx, IR::Inst* inst) { template static void EmitRecipEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; if constexpr (fsize != 16) { if (ctx.HasOptimization(OptimizationFlag::Unsafe_ReducedErrorFP)) { @@ -1589,7 +1590,7 @@ void EmitX64::EmitFPVectorRecipEstimate64(EmitContext& ctx, IR::Inst* inst) { template static void EmitRecipStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; const auto fallback_fn = [](VectorArray& result, const VectorArray& op1, const VectorArray& op2, FP::FPCR fpcr, FP::FPSR& fpsr) { for (size_t i = 0; i < result.size(); i++) { @@ -1759,7 +1760,7 @@ void EmitX64::EmitFPVectorRoundInt64(EmitContext& ctx, IR::Inst* inst) { template static void EmitRSqrtEstimate(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; const auto fallback_fn = [](VectorArray& result, const VectorArray& operand, FP::FPCR fpcr, FP::FPSR& fpsr) { for (size_t i = 0; i < result.size(); i++) { @@ -1851,7 +1852,7 @@ void EmitX64::EmitFPVectorRSqrtEstimate64(EmitContext& ctx, IR::Inst* inst) { template static void EmitRSqrtStepFused(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; const auto fallback_fn = [](VectorArray& result, const VectorArray& op1, const VectorArray& op2, FP::FPCR fpcr, FP::FPSR& fpsr) { for (size_t i = 0; i < result.size(); i++) { @@ -2149,7 +2150,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { mp::lift_value>; static const auto lut = Common::GenerateLookupTableFromList([](I) { - using FPT = FP::UnsignedIntegerN; // WORKAROUND: For issue 678 on MSVC + using FPT = Common::UnsignedIntegerN; // WORKAROUND: For issue 678 on MSVC return std::pair{ mp::lower_to_tuple_v, Common::FptrCast([](VectorArray& output, const VectorArray& input, FP::FPCR fpcr, FP::FPSR& fpsr) { diff --git a/src/dynarmic/src/dynarmic/common/cast_util.h b/src/dynarmic/src/dynarmic/common/cast_util.h deleted file mode 100644 index 92c9a259b3..0000000000 --- a/src/dynarmic/src/dynarmic/common/cast_util.h +++ /dev/null @@ -1,18 +0,0 @@ -/* This file is part of the dynarmic project. - * Copyright (c) 2018 MerryMage - * SPDX-License-Identifier: 0BSD - */ - -#pragma once - -#include - -namespace Dynarmic::Common { - -/// Cast a lambda into an equivalent function pointer. -template -inline auto FptrCast(Function f) noexcept { - return static_cast*>(f); -} - -} // namespace Dynarmic::Common diff --git a/src/dynarmic/src/dynarmic/common/fp/util.h b/src/dynarmic/src/dynarmic/common/fp/util.h index 9e06d0ee59..3cb1bcf217 100644 --- a/src/dynarmic/src/dynarmic/common/fp/util.h +++ b/src/dynarmic/src/dynarmic/common/fp/util.h @@ -97,14 +97,4 @@ constexpr std::optional ProcessNaNs(FPT a, FPT b, FPT c) { return std::nullopt; } -namespace Detail { -template struct IntegerOfSize {}; -template<> struct IntegerOfSize<8> { using U = std::uint8_t, S = std::int8_t; }; -template<> struct IntegerOfSize<16> { using U = std::uint16_t, S = std::int16_t; }; -template<> struct IntegerOfSize<32> { using U = std::uint32_t, S = std::int32_t; }; -template<> struct IntegerOfSize<64> { using U = std::uint64_t, S = std::int64_t; }; -} -template using FP::UnsignedIntegerN = typename Detail::IntegerOfSize::U; -template using FP::SignedIntegerN = typename Detail::IntegerOfSize::S; - } // namespace Dynarmic::FP diff --git a/src/dynarmic/src/dynarmic/common/type_util.h b/src/dynarmic/src/dynarmic/common/type_util.h new file mode 100644 index 0000000000..7bc7e08281 --- /dev/null +++ b/src/dynarmic/src/dynarmic/common/type_util.h @@ -0,0 +1,28 @@ +/* This file is part of the dynarmic project. + * Copyright (c) 2018 MerryMage + * SPDX-License-Identifier: 0BSD + */ + +#pragma once + +#include + +namespace Dynarmic::Common { + +/// Cast a lambda into an equivalent function pointer. +template +inline auto FptrCast(Function f) noexcept { + return static_cast*>(f); +} + +namespace Detail { +template struct IntegerOfSize {}; +template<> struct IntegerOfSize<8> { using U = std::uint8_t; using S = std::int8_t; }; +template<> struct IntegerOfSize<16> { using U = std::uint16_t; using S = std::int16_t; }; +template<> struct IntegerOfSize<32> { using U = std::uint32_t; using S = std::int32_t; }; +template<> struct IntegerOfSize<64> { using U = std::uint64_t; using S = std::int64_t; }; +} +template using UnsignedIntegerN = typename Detail::IntegerOfSize::U; +template using SignedIntegerN = typename Detail::IntegerOfSize::S; + +} // namespace Dynarmic::Common