From 6f0ff9e54b15cd6e2e2cd27d3a0d6c92a13e6692 Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Fri, 10 May 2024 08:05:28 -0700 Subject: [PATCH] [a64] Preserve X0 when resolving functions Fixes indirect branches --- src/xenia/cpu/backend/a64/a64_backend.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_backend.cc b/src/xenia/cpu/backend/a64/a64_backend.cc index f95ae43d5..ee24766af 100644 --- a/src/xenia/cpu/backend/a64/a64_backend.cc +++ b/src/xenia/cpu/backend/a64/a64_backend.cc @@ -437,7 +437,7 @@ ResolveFunctionThunk A64ThunkEmitter::EmitResolveFunctionThunk() { code_offsets.prolog = offset(); - // rsp + 0 = return address + STP(ZR, X0, SP, PRE_INDEXED, -16); SUB(SP, SP, stack_size); code_offsets.prolog_stack_alloc = offset(); @@ -453,6 +453,7 @@ ResolveFunctionThunk A64ThunkEmitter::EmitResolveFunctionThunk() { MOV(W1, W17); MOV(X16, reinterpret_cast(&ResolveFunction)); BLR(X16); + MOV(X16, X0); EmitLoadVolatileRegs(); @@ -461,7 +462,8 @@ ResolveFunctionThunk A64ThunkEmitter::EmitResolveFunctionThunk() { // add(rsp, stack_size); // jmp(rax); ADD(SP, SP, stack_size); - BR(X0); + LDP(ZR, X0, SP, POST_INDEXED, 16); + BR(X16); code_offsets.tail = offset();