From cf704a460dfc7dde3ae6d6561789669bfd4b4f20 Mon Sep 17 00:00:00 2001 From: Merry Date: Tue, 29 Nov 2022 14:14:00 +0000 Subject: [PATCH] EmitTwoOpFallbackWithoutRegAlloc: Simplify --- src/dynarmic/backend/arm64/a64_jitstate.h | 2 +- .../emit_arm64_vector_floating_point.cpp | 23 +++++-------------- 2 files changed, 7 insertions(+), 18 deletions(-) diff --git a/src/dynarmic/backend/arm64/a64_jitstate.h b/src/dynarmic/backend/arm64/a64_jitstate.h index 223a36c9..215e6987 100644 --- a/src/dynarmic/backend/arm64/a64_jitstate.h +++ b/src/dynarmic/backend/arm64/a64_jitstate.h @@ -20,7 +20,7 @@ struct A64JitState { u32 cpsr_nzcv = 0; - alignas(16) std::array vec{}; // Extension registers. + alignas(16) std::array vec{}; u32 exclusive_state = 0; diff --git a/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp b/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp index d534c8b8..088b5cc2 100644 --- a/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp +++ b/src/dynarmic/backend/arm64/emit_arm64_vector_floating_point.cpp @@ -263,30 +263,20 @@ static void EmitTwoOpFallbackWithoutRegAlloc(oaknut::CodeGenerator& code, EmitCo const auto fn = static_cast*>(lambda); const u32 fpcr = ctx.FPCR(fpcr_controlled).Value(); - constexpr u64 stack_size = sizeof(u64) * 4; // sizeof(u128)*2 - oaknut::Label fn_ptr, end; + constexpr u64 stack_size = sizeof(u64) * 4; // sizeof(u128) * 2 ABI_PushRegisters(code, ABI_CALLER_SAVE & ~(1ull << Qresult.index()), stack_size); - code.MOV(Xscratch0, SP); - code.LDR(Xscratch1, fn_ptr); - // Call lambda(Vec&, Vec&, fpcr, fpsr&) - code.ADD(X0, Xscratch0, 0 * 16); - code.ADD(X1, Xscratch0, 1 * 16); + code.MOV(Xscratch0, mcl::bit_cast(fn)); + code.ADD(X0, SP, 0 * 16); + code.ADD(X1, SP, 1 * 16); code.MOV(X2, fpcr); code.ADD(X3, Xstate, ctx.conf.state_fpsr_offset); code.STR(Qarg1, X1); - code.BLR(Xscratch1); - - // Reload result + code.BLR(Xscratch0); code.LDR(Qresult, SP); - ABI_PopRegisters(code, ABI_CALLER_SAVE & ~(1ull << Qresult.index()), stack_size); - code.B(end); - code.align(8); - code.l(fn_ptr); - code.dx(mcl::bit_cast(fn)); - code.l(end); + ABI_PopRegisters(code, ABI_CALLER_SAVE & ~(1ull << Qresult.index()), stack_size); } template @@ -295,7 +285,6 @@ static void EmitTwoOpFallback(oaknut::CodeGenerator& code, EmitContext& ctx, IR: auto Qarg1 = ctx.reg_alloc.ReadQ(args[0]); auto Qresult = ctx.reg_alloc.WriteQ(inst); RegAlloc::Realize(Qarg1, Qresult); - ctx.reg_alloc.SpillFlags(); ctx.fpsr.Spill();