diff --git a/makefile.burn_rules b/makefile.burn_rules index 25060d090..d9a7e716d 100644 --- a/makefile.burn_rules +++ b/makefile.burn_rules @@ -146,6 +146,10 @@ ifdef BUILD_X86_ASM endif ifdef INCLUDE_KILLER_INSTINCT - alldir += burn/drv/midway cpu/adsp2100 cpu/mips3 cpu/mips3/x64 + alldir += burn/drv/midway cpu/adsp2100 cpu/mips3 depobj += dcs2k.o ide.o adsp2100.o cop0.o cop1.o mips3.o adsp2100_intf.o mips3_intf.o +ifdef BUILD_X64_EXE + alldir += cpu/mips3/x64 + depobj += mips3_x64.o +endif endif \ No newline at end of file diff --git a/makefile.mingw b/makefile.mingw index dedb11f6b..9008b19a7 100644 --- a/makefile.mingw +++ b/makefile.mingw @@ -300,6 +300,9 @@ endif ifdef BUILD_X64_EXE DEF := $(DEF) -DBUILD_X64_EXE +ifdef INCLUDE_KILLER_INSTINCT + DEF := $(DEF) -DXBYAK_NO_OP_NAMES -DMIPS3_X64_DRC +endif endif ifdef SYMBOL diff --git a/src/cpu/mips3/x64/mips3_x64.cpp b/src/cpu/mips3/x64/mips3_x64.cpp index 8ce373432..bbf43bae9 100644 --- a/src/cpu/mips3/x64/mips3_x64.cpp +++ b/src/cpu/mips3/x64/mips3_x64.cpp @@ -97,6 +97,10 @@ void mips3_x64::prolog() // RBX = cpu_state base push(rbp); push(rbx); +#ifdef _WIN32 + push(rsi); + push(rdi); +#endif push(r15); mov(rbp, rsp); sub(rsp, 16); @@ -113,6 +117,10 @@ void mips3_x64::epilog(bool do_ret) mov(rax, ADR(m_icounter)); mov(ptr[rax], r15); pop(r15); +#if _WIN32 + pop(rdi); + pop(rsi); +#endif pop(rbx); pop(rbp); if (do_ret) @@ -452,9 +460,15 @@ void mips3_x64::set_next_pc(addr_t addr) void mips3_x64::fallback(uint32_t opcode, void (mips3::*f)(uint32_t)) { +#ifdef _WIN32 + // WIN64 ABI - MICROSOFT + mov(rcx, (size_t) m_core); + mov(edx, opcode); +#else // SysV AMD64 ABI - GNU mov(rdi, (size_t) m_core); mov(esi, opcode); +#endif mov(rax, (size_t) (void*)f); call(rax); }