Explorar o código

arm: fix context save of vector regs

Liam %!s(int64=2) %!d(string=hai) anos
pai
achega
f0ee3e29cb
Modificáronse 1 ficheiros con 4 adicións e 6 borrados
  1. 4 6
      src/core/arm/dynarmic/arm_dynarmic_32.cpp

+ 4 - 6
src/core/arm/dynarmic/arm_dynarmic_32.cpp

@@ -400,9 +400,8 @@ void ArmDynarmic32::GetContext(Kernel::Svc::ThreadContext& ctx) const {
     ctx.pc = gpr[15];
     ctx.pstate = j.Cpsr();
 
-    for (size_t i = 0; i < 32; i++) {
-        ctx.v[i] = {fpr[i], 0};
-    }
+    static_assert(sizeof(fpr) <= sizeof(ctx.v));
+    std::memcpy(ctx.v.data(), &fpr, sizeof(fpr));
 
     auto [fpsr, fpcr] = FpscrToFpsrFpcr(j.Fpscr());
     ctx.fpcr = fpcr;
@@ -421,9 +420,8 @@ void ArmDynarmic32::SetContext(const Kernel::Svc::ThreadContext& ctx) {
 
     j.SetCpsr(ctx.pstate);
 
-    for (size_t i = 0; i < 32; i++) {
-        fpr[i] = static_cast<u32>(ctx.v[i][0]);
-    }
+    static_assert(sizeof(fpr) <= sizeof(ctx.v));
+    std::memcpy(&fpr, ctx.v.data(), sizeof(fpr));
 
     j.SetFpscr(FpsrFpcrToFpscr(ctx.fpsr, ctx.fpcr));
     m_cp15->uprw = static_cast<u32>(ctx.tpidr);