From 52c75c8dbc253d3ddd5e602b307ff4e0ca5d95bf Mon Sep 17 00:00:00 2001 From: "Dr. Chat" Date: Fri, 26 Aug 2016 13:46:21 -0500 Subject: [PATCH] x64 backend: Pass guest return address as first argument to guest functions. --- src/xenia/cpu/backend/x64/x64_backend.cc | 2 +- src/xenia/cpu/backend/x64/x64_emitter.cc | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/xenia/cpu/backend/x64/x64_backend.cc b/src/xenia/cpu/backend/x64/x64_backend.cc index c5976f84f..b3bed290b 100644 --- a/src/xenia/cpu/backend/x64/x64_backend.cc +++ b/src/xenia/cpu/backend/x64/x64_backend.cc @@ -422,7 +422,7 @@ HostToGuestThunk X64ThunkEmitter::EmitHostToGuestThunk() { mov(rax, rcx); mov(rsi, rdx); // context - mov(rdx, r8); + mov(rcx, r8); // return address call(rax); movaps(xmm6, qword[rsp + offsetof(StackLayout::Thunk, xmm[0])]); diff --git a/src/xenia/cpu/backend/x64/x64_emitter.cc b/src/xenia/cpu/backend/x64/x64_emitter.cc index b19579cc4..16c4c5eb5 100644 --- a/src/xenia/cpu/backend/x64/x64_emitter.cc +++ b/src/xenia/cpu/backend/x64/x64_emitter.cc @@ -169,7 +169,7 @@ bool X64Emitter::Emit(HIRBuilder* builder, size_t* out_stack_size) { stack_size_ = stack_size; sub(rsp, (uint32_t)stack_size); mov(qword[rsp + StackLayout::GUEST_CTX_HOME], GetContextReg()); - mov(qword[rsp + StackLayout::GUEST_RET_ADDR], rdx); + mov(qword[rsp + StackLayout::GUEST_RET_ADDR], rcx); mov(qword[rsp + StackLayout::GUEST_CALL_RET_ADDR], 0); // Safe now to do some tracing. @@ -384,13 +384,13 @@ void X64Emitter::Call(const hir::Instr* instr, GuestFunction* function) { EmitTraceUserCallReturn(); // Pass the callers return address over. - mov(rdx, qword[rsp + StackLayout::GUEST_RET_ADDR]); + mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]); add(rsp, static_cast(stack_size())); jmp(rax); } else { // Return address is from the previous SET_RETURN_ADDRESS. - mov(rdx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); + mov(rcx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); call(rax); } @@ -427,13 +427,13 @@ void X64Emitter::CallIndirect(const hir::Instr* instr, EmitTraceUserCallReturn(); // Pass the callers return address over. - mov(rdx, qword[rsp + StackLayout::GUEST_RET_ADDR]); + mov(rcx, qword[rsp + StackLayout::GUEST_RET_ADDR]); add(rsp, static_cast(stack_size())); jmp(rax); } else { // Return address is from the previous SET_RETURN_ADDRESS. - mov(rdx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); + mov(rcx, qword[rsp + StackLayout::GUEST_CALL_RET_ADDR]); call(rax); }