diff --git a/core/imgread/gdi.cpp b/core/imgread/gdi.cpp index 3f59ea5bf..359f03a8b 100644 --- a/core/imgread/gdi.cpp +++ b/core/imgread/gdi.cpp @@ -3,10 +3,22 @@ #include #include +// On windows, transform / to \\ + +string normalize_path_separator(string path) +{ + #if HOST_OS == OS_WINDOWS + std::replace( path.begin(), path.end(), '/', '\\'); + #endif + + return path; +} + // given file/name.ext or file\name.ext returns file/ or file\, depending on the platform // given name.ext returns ./ or .\, depending on the platform string OS_dirname(string file) { + file = normalize_path_separator(file); #if HOST_OS == OS_WINDOWS const char sep = '\\'; #else @@ -25,19 +37,6 @@ string OS_dirname(string file) return file.substr(0, last_slash + 1); } -// On windows, transform / to \\ -// On linux, transform \\ to / -string normalize_path_separator(string path) -{ - #if HOST_OS == OS_WINDOWS - std::replace( path.begin(), path.end(), '/', '\\'); - #else - std::replace( path.begin(), path.end(), '\\', '/'); - #endif - - return path; -} - #if 0 // TODO: Move this to some tests, make it platform agnostic namespace { struct OS_dirname_Test { diff --git a/core/rec-x64/rec_x64.cpp b/core/rec-x64/rec_x64.cpp index 848cc6d84..8c4013133 100644 --- a/core/rec-x64/rec_x64.cpp +++ b/core/rec-x64/rec_x64.cpp @@ -1394,7 +1394,11 @@ private: mov(rax, (uintptr_t)p_sh4rcb->cntx.vmem32_base); u32 size = op.flags & 0x7f; - verify(getCurr() - start_addr == 26); + //verify(getCurr() - start_addr == 26); + if (mem_access_offset == 0) + mem_access_offset = getCurr() - start_addr; + else + verify(getCurr() - start_addr == mem_access_offset); block->memory_accesses[(void*)getCurr()] = (u32)current_opid; switch (size) @@ -1438,7 +1442,11 @@ private: mov(rax, (uintptr_t)p_sh4rcb->cntx.vmem32_base); u32 size = op.flags & 0x7f; - verify(getCurr() - start_addr == 26); + //verify(getCurr() - start_addr == 26); + if (mem_access_offset == 0) + mem_access_offset = getCurr() - start_addr; + else + verify(getCurr() - start_addr == mem_access_offset); block->memory_accesses[(void*)getCurr()] = (u32)current_opid; switch (size) @@ -1707,6 +1715,8 @@ private: static const f32 cvtf2i_pos_saturation; static const u32 read_mem_op_size; static const u32 write_mem_op_size; +public: + static u32 mem_access_offset; }; const u32 BlockCompiler::float_sign_mask = 0x80000000; @@ -1714,6 +1724,7 @@ const u32 BlockCompiler::float_abs_mask = 0x7fffffff; const f32 BlockCompiler::cvtf2i_pos_saturation = 2147483520.0f; // IEEE 754: 0x4effffff; const u32 BlockCompiler::read_mem_op_size = 30; const u32 BlockCompiler::write_mem_op_size = 30; +u32 BlockCompiler::mem_access_offset = 0; void X64RegAlloc::Preload(u32 reg, Xbyak::Operand::Code nreg) { @@ -1787,7 +1798,7 @@ bool ngen_Rewrite(unat& host_pc, unat, unat) verify(opid < block->oplist.size()); const shil_opcode& op = block->oplist[opid]; - BlockCompiler *assembler = new BlockCompiler(code_ptr - 26); + BlockCompiler *assembler = new BlockCompiler(code_ptr - BlockCompiler::mem_access_offset); assembler->InitializeRewrite(block, opid); if (op.op == shop_readm) assembler->GenReadMemorySlow(op, block); @@ -1797,7 +1808,7 @@ bool ngen_Rewrite(unat& host_pc, unat, unat) verify(block->host_code_size >= assembler->getSize()); delete assembler; block->memory_accesses.erase(it); - host_pc = (unat)(code_ptr - 26); + host_pc = (unat)(code_ptr - BlockCompiler::mem_access_offset); return true; }