MIPS3: X64 DRC Compile with MSVC
This commit is contained in:
parent
e2a964357b
commit
424f646b8b
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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<class C, class R, typename...Args>
|
||||
size_t get_method_addr(R (C::*f)(Args...)) {
|
||||
return reinterpret_cast<size_t>((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])
|
||||
|
|
|
@ -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);\
|
||||
|
|
Loading…
Reference in New Issue