summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Liam2023-12-04 22:19:11 -0500
committerGravatar Liam2023-12-04 22:19:11 -0500
commitf0ee3e29cb6fa5c5d45f5ecd78091295add72baa (patch)
tree7943c622b7171a813df5efcf309498cc4730e20f
parentcore: refactor emulated cpu core activation (diff)
downloadyuzu-f0ee3e29cb6fa5c5d45f5ecd78091295add72baa.tar.gz
yuzu-f0ee3e29cb6fa5c5d45f5ecd78091295add72baa.tar.xz
yuzu-f0ee3e29cb6fa5c5d45f5ecd78091295add72baa.zip
arm: fix context save of vector regs
Diffstat (limited to '')
-rw-r--r--src/core/arm/dynarmic/arm_dynarmic_32.cpp10
1 files changed, 4 insertions, 6 deletions
diff --git a/src/core/arm/dynarmic/arm_dynarmic_32.cpp b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
index cf52c0505..f34865e26 100644
--- a/src/core/arm/dynarmic/arm_dynarmic_32.cpp
+++ b/src/core/arm/dynarmic/arm_dynarmic_32.cpp
@@ -400,9 +400,8 @@ void ArmDynarmic32::GetContext(Kernel::Svc::ThreadContext& ctx) const {
400 ctx.pc = gpr[15]; 400 ctx.pc = gpr[15];
401 ctx.pstate = j.Cpsr(); 401 ctx.pstate = j.Cpsr();
402 402
403 for (size_t i = 0; i < 32; i++) { 403 static_assert(sizeof(fpr) <= sizeof(ctx.v));
404 ctx.v[i] = {fpr[i], 0}; 404 std::memcpy(ctx.v.data(), &fpr, sizeof(fpr));
405 }
406 405
407 auto [fpsr, fpcr] = FpscrToFpsrFpcr(j.Fpscr()); 406 auto [fpsr, fpcr] = FpscrToFpsrFpcr(j.Fpscr());
408 ctx.fpcr = fpcr; 407 ctx.fpcr = fpcr;
@@ -421,9 +420,8 @@ void ArmDynarmic32::SetContext(const Kernel::Svc::ThreadContext& ctx) {
421 420
422 j.SetCpsr(ctx.pstate); 421 j.SetCpsr(ctx.pstate);
423 422
424 for (size_t i = 0; i < 32; i++) { 423 static_assert(sizeof(fpr) <= sizeof(ctx.v));
425 fpr[i] = static_cast<u32>(ctx.v[i][0]); 424 std::memcpy(&fpr, ctx.v.data(), sizeof(fpr));
426 }
427 425
428 j.SetFpscr(FpsrFpcrToFpscr(ctx.fpsr, ctx.fpcr)); 426 j.SetFpscr(FpsrFpcrToFpscr(ctx.fpsr, ctx.fpcr));
429 m_cp15->uprw = static_cast<u32>(ctx.tpidr); 427 m_cp15->uprw = static_cast<u32>(ctx.tpidr);