From f03c6571cb0d8aaa8e3e4e698616739bc81c361f 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 | 54 +++++++------------ .../backend/x64/emit_x64_memory.cpp.inc | 6 +-- .../backend/x64/emit_x64_saturation.cpp | 5 +- .../x64/emit_x64_vector_floating_point.cpp | 39 +++++++------- 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, 80 insertions(+), 92 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 3e70c7975e..79f6e811b6 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 8a6955c5e8..fe5cf89733 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 @@ -20,7 +20,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 e53177a782..6a7464d555 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); @@ -1105,7 +1091,7 @@ static void EmitFPRound(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst, siz constexpr size_t fsize = mp::get<0, I>::value; constexpr FP::RoundingMode rounding_mode = mp::get<1, I>::value; constexpr bool exact = mp::get<2, I>::value; - using InputSize = FP::UnsignedIntegerN; + using InputSize = Common::UnsignedIntegerN; return FP::FPRoundInt(static_cast(input), fpcr, rounding_mode, exact, fpsr); })}; @@ -1133,7 +1119,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)) { @@ -1312,7 +1298,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); @@ -1735,7 +1721,7 @@ static void EmitFPToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { [](u64 input, FP::FPSR& fpsr, FP::FPCR fpcr) { constexpr size_t fbits = mp::get<0, I>::value; constexpr FP::RoundingMode rounding_mode = mp::get<1, I>::value; - using FPT = FP::UnsignedIntegerN; + using FPT = Common::UnsignedIntegerN; return FP::FPToFixed(isize, static_cast(input), fbits, unsigned_, fpcr, rounding_mode, fpsr); })}; 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 351efca562..0d4e160725 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); } @@ -1083,7 +1084,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 { @@ -1156,7 +1157,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 { @@ -1312,7 +1313,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++) { @@ -1423,7 +1424,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(); @@ -1489,7 +1490,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); @@ -1542,7 +1543,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)) { @@ -1588,7 +1589,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++) { @@ -1720,7 +1721,7 @@ void EmitFPVectorRoundInt(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { 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( @@ -1752,7 +1753,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++) { @@ -1844,7 +1845,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++) { @@ -2114,7 +2115,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { FCODE(orp)(src, exceed_unsigned); } } else { - using FPT = FP::UnsignedIntegerN; // WORKAROUND: For issue 678 on MSVC + using FPT = Common::UnsignedIntegerN; // WORKAROUND: For issue 678 on MSVC constexpr u64 integer_max = static_cast((std::numeric_limits>>::max)()); code.movaps(xmm0, GetVectorOf(code)); @@ -2139,7 +2140,7 @@ void EmitFPVectorToFixed(BlockOfCode& code, EmitContext& ctx, IR::Inst* inst) { 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( 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