From 424f646b8b609e8f23dcea7eb567fc6372e733cb Mon Sep 17 00:00:00 2001 From: Marcos Medeiros <1381933+zxmarcos@users.noreply.github.com> Date: Thu, 14 May 2015 22:58:27 +0000 Subject: [PATCH] MIPS3: X64 DRC Compile with MSVC --- src/cpu/mips3/x64/mips3_x64.cpp | 4 +++- src/cpu/mips3/x64/mips3_x64_defs.h | 9 +++++++++ src/cpu/mips3/x64/mips3_x64_rw.h | 5 +++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/cpu/mips3/x64/mips3_x64.cpp b/src/cpu/mips3/x64/mips3_x64.cpp index bbf43bae9..32e61cbe1 100644 --- a/src/cpu/mips3/x64/mips3_x64.cpp +++ b/src/cpu/mips3/x64/mips3_x64.cpp @@ -29,6 +29,7 @@ namespace mips { + mips3_x64::mips3_x64(mips3 *interpreter) : CodeGenerator(1024 * 1024 * 16) { m_core = interpreter; @@ -469,7 +470,8 @@ void mips3_x64::fallback(uint32_t opcode, void (mips3::*f)(uint32_t)) mov(rdi, (size_t) m_core); mov(esi, opcode); #endif - mov(rax, (size_t) (void*)f); + + mov(rax, (size_t) (void*&)f); call(rax); } diff --git a/src/cpu/mips3/x64/mips3_x64_defs.h b/src/cpu/mips3/x64/mips3_x64_defs.h index 9b4709ff5..a129ce286 100644 --- a/src/cpu/mips3/x64/mips3_x64_defs.h +++ b/src/cpu/mips3/x64/mips3_x64_defs.h @@ -30,7 +30,16 @@ #define HI_ref ((size_t)&m_core->m_state.hi) #define R_ref(n) ((size_t)&m_core->m_state.r[n]) #define ADR(n) ((size_t)&n) + +namespace mips { +template +size_t get_method_addr(R (C::*f)(Args...)) { + return reinterpret_cast((void* &)f); +} +} + #define F_ADR(f) ((size_t)(void*)&f) +#define M_ADR(f) (mips::get_method_addr(&f)) #define FPR_ref(n) ((size_t)&m_core->m_state.cpr[1][n]) #define FCR_ref(n) ((size_t)&m_core->m_state.fcr[n]) diff --git a/src/cpu/mips3/x64/mips3_x64_rw.h b/src/cpu/mips3/x64/mips3_x64_rw.h index b0a75e7e6..98c0edea5 100644 --- a/src/cpu/mips3/x64/mips3_x64_rw.h +++ b/src/cpu/mips3/x64/mips3_x64_rw.h @@ -24,7 +24,8 @@ namespace mips add(rsi, RS_x);\ and_(rsi, ~((uint64_t)ignore));\ lea(rdx, eaddr);\ - mov(rax, F_ADR(mips3::translate));\ + size_t madr = M_ADR(mips3::translate);\ + mov(rax, madr);\ call(rax);\ mov(rdx, eaddr);\ } while (0) @@ -39,7 +40,7 @@ namespace mips and_(rsi, ~((uint64_t)ignore));\ lea(rdx, eaddr);\ mov(vaddr, rsi);\ - mov(rax, F_ADR(mips3::translate));\ + mov(rax, M_ADR(mips3::translate));\ call(rax);\ mov(rdx, eaddr);\ mov(rcx, vaddr);\