From 3d345d71a733762755ee288d017d0d030a5d693b Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Sat, 4 May 2024 11:22:37 -0700 Subject: [PATCH] [a64] Fix overwriting of return-value registers These are stomping over X0 and Q0 which is returning input argument registers as return values. Fixes some guest-to-host calls. --- src/xenia/cpu/backend/a64/a64_backend.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_backend.cc b/src/xenia/cpu/backend/a64/a64_backend.cc index 6320cf4d7..35bba8f46 100644 --- a/src/xenia/cpu/backend/a64/a64_backend.cc +++ b/src/xenia/cpu/backend/a64/a64_backend.cc @@ -458,7 +458,9 @@ void A64ThunkEmitter::EmitSaveVolatileRegs() { } void A64ThunkEmitter::EmitLoadVolatileRegs() { - LDR(X0, XSP, offsetof(StackLayout::Thunk, r[0])); + // Preserve arguments passed to and returned from a subroutine + // LDR(X0, XSP, offsetof(StackLayout::Thunk, r[0])); + LDR(X1, XSP, offsetof(StackLayout::Thunk, r[1])); LDR(X2, XSP, offsetof(StackLayout::Thunk, r[2])); LDR(X3, XSP, offsetof(StackLayout::Thunk, r[3])); @@ -481,7 +483,8 @@ void A64ThunkEmitter::EmitLoadVolatileRegs() { LDR(X30, XSP, offsetof(StackLayout::Thunk, r[19])); - LDR(Q0, XSP, offsetof(StackLayout::Thunk, xmm[0])); + // Preserve arguments passed to and returned from a subroutine + // LDR(Q0, XSP, offsetof(StackLayout::Thunk, xmm[0])); LDR(Q1, XSP, offsetof(StackLayout::Thunk, xmm[1])); LDR(Q2, XSP, offsetof(StackLayout::Thunk, xmm[2])); LDR(Q3, XSP, offsetof(StackLayout::Thunk, xmm[3]));