From c6a7270a06037b3a7ceb75fed67f82bfb4b7e0bf Mon Sep 17 00:00:00 2001 From: Wunkolo Date: Tue, 7 May 2024 06:52:05 -0700 Subject: [PATCH] [a64] Fix external function call arguments `x0` was loading the thunk rather than using `xip` Fixes lots of init bugs! --- src/xenia/cpu/backend/a64/a64_emitter.cc | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/src/xenia/cpu/backend/a64/a64_emitter.cc b/src/xenia/cpu/backend/a64/a64_emitter.cc index 4dd5cfdee..dfcc0c7e9 100644 --- a/src/xenia/cpu/backend/a64/a64_emitter.cc +++ b/src/xenia/cpu/backend/a64/a64_emitter.cc @@ -504,7 +504,6 @@ void A64Emitter::CallIndirect(const hir::Instr* instr, MOV(W1, reg.toW()); } // mov(eax, dword[ebx]); - LDR(W16, X1); } else { // Old-style resolve. // Not too important because indirection table is almost always available. @@ -566,11 +565,6 @@ void A64Emitter::CallExtern(const hir::Instr* instr, const Function* function) { // x1 = arg0 // x2 = arg1 // x3 = arg2 - // mov(rax, reinterpret_cast(thunk)); - // mov(rcx, reinterpret_cast(builtin_function->handler())); - // mov(rdx, reinterpret_cast(builtin_function->arg0())); - // mov(r8, reinterpret_cast(builtin_function->arg1())); - // call(rax); MOV(X0, reinterpret_cast(builtin_function->handler())); MOV(X1, reinterpret_cast(builtin_function->arg0())); MOV(X2, reinterpret_cast(builtin_function->arg1())); @@ -590,17 +584,10 @@ void A64Emitter::CallExtern(const hir::Instr* instr, const Function* function) { // x1 = arg0 // x2 = arg1 // x3 = arg2 - auto thunk = backend()->guest_to_host_thunk(); - // mov(rax, reinterpret_cast(thunk)); - // mov(rcx, - // reinterpret_cast(extern_function->extern_handler())); - // mov(rdx, - // qword[GetContextReg() + offsetof(ppc::PPCContext, kernel_state)]); - // call(rax); - MOV(X0, reinterpret_cast(thunk)); - MOV(X1, reinterpret_cast(extern_function->extern_handler())); - LDR(X2, GetContextReg(), offsetof(ppc::PPCContext, kernel_state)); + MOV(X0, reinterpret_cast(extern_function->extern_handler())); + LDR(X1, GetContextReg(), offsetof(ppc::PPCContext, kernel_state)); + auto thunk = backend()->guest_to_host_thunk(); MOV(X16, reinterpret_cast(thunk)); BLR(X16);