diff --git a/src/devices/cpu/drcbex64.cpp b/src/devices/cpu/drcbex64.cpp index 7e1694ff8998f..ff22f34be2f74 100644 --- a/src/devices/cpu/drcbex64.cpp +++ b/src/devices/cpu/drcbex64.cpp @@ -2512,73 +2512,40 @@ void drcbe_x64::op_read(Assembler &a, const instruction &inst) Gp dstreg = dstp.select_register(eax); // set up a call to the read handler - auto &trampolines = m_accessors[spacesizep.space()]; auto &resolved = m_resolved_accessors[spacesizep.space()]; - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp + mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte.obj); // mov param1,space - smart_call_r64(a, resolved.read_byte.func, rax); // call read_byte - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_byte); // call read_byte - } - a.movzx(dstreg, al); // movzx dstreg,al + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte.obj); // mov param1,space + smart_call_r64(a, resolved.read_byte.func, rax); // call read_byte + a.movzx(dstreg, al); // movzx dstreg,al } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word.obj); // mov param1,space - smart_call_r64(a, resolved.read_word.func, rax); // call read_word - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_word); // call read_word - } - a.movzx(dstreg, ax); // movzx dstreg,ax + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word.obj); // mov param1,space + smart_call_r64(a, resolved.read_word.func, rax); // call read_word + a.movzx(dstreg, ax); // movzx dstreg,ax } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword.obj); // mov param1,space - smart_call_r64(a, resolved.read_dword.func, rax); // call read_dword - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_dword); // call read_dword - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword.obj); // mov param1,space + smart_call_r64(a, resolved.read_dword.func, rax); // call read_dword if (dstreg != eax || inst.size() == 8) - a.mov(dstreg, eax); // mov dstreg,eax + a.mov(dstreg, eax); // mov dstreg,eax } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword.obj); // mov param1,space - smart_call_r64(a, resolved.read_qword.func, rax); // call read_qword - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_qword); // call read_qword - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword.obj); // mov param1,space + smart_call_r64(a, resolved.read_qword.func, rax); // call read_qword if (dstreg != eax) - a.mov(dstreg.r64(), rax); // mov dstreg,rax + a.mov(dstreg.r64(), rax); // mov dstreg,rax } // store result if (inst.size() == 4) - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg else - mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg + mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg } @@ -2604,77 +2571,44 @@ void drcbe_x64::op_readm(Assembler &a, const instruction &inst) Gp dstreg = dstp.select_register(eax); // set up a call to the read handler - auto &trampolines = m_accessors[spacesizep.space()]; auto &resolved = m_resolved_accessors[spacesizep.space()]; - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp + mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp if (spacesizep.size() != SIZE_QWORD) - mov_reg_param(a, Gpd(REG_PARAM3), maskp); // mov param3,maskp + mov_reg_param(a, Gpd(REG_PARAM3), maskp); // mov param3,maskp else - mov_reg_param(a, Gpq(REG_PARAM3), maskp); // mov param3,maskp + mov_reg_param(a, Gpq(REG_PARAM3), maskp); // mov param3,maskp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.read_byte_masked) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte_masked.obj); // mov param1,space - smart_call_r64(a, resolved.read_byte_masked.func, rax); // call read_byte_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_byte_masked); // call read_byte_masked - } - a.movzx(dstreg, al); // movzx dstreg,al + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_byte_masked.obj); // mov param1,space + smart_call_r64(a, resolved.read_byte_masked.func, rax); // call read_byte_masked + a.movzx(dstreg, al); // movzx dstreg,al } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.read_word_masked) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word_masked.obj); // mov param1,space - smart_call_r64(a, resolved.read_word_masked.func, rax); // call read_word_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_word_masked); // call read_word_masked - } - a.movzx(dstreg, ax); // movzx dstreg,ax + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_word_masked.obj); // mov param1,space + smart_call_r64(a, resolved.read_word_masked.func, rax); // call read_word_masked + a.movzx(dstreg, ax); // movzx dstreg,ax } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.read_dword_masked) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword_masked.obj); // mov param1,space - smart_call_r64(a, resolved.read_dword_masked.func, rax); // call read_dword_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_dword_masked); // call read_word_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_dword_masked.obj); // mov param1,space + smart_call_r64(a, resolved.read_dword_masked.func, rax); // call read_dword_masked if (dstreg != eax || inst.size() == 8) - a.mov(dstreg, eax); // mov dstreg,eax + a.mov(dstreg, eax); // mov dstreg,eax } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.read_qword_masked) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword_masked.obj); // mov param1,space - smart_call_r64(a, resolved.read_qword_masked.func, rax); // call read_qword_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.read_qword_masked); // call read_word_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.read_qword_masked.obj); // mov param1,space + smart_call_r64(a, resolved.read_qword_masked.func, rax); // call read_qword_masked if (dstreg != eax) - a.mov(dstreg.r64(), rax); // mov dstreg,rax + a.mov(dstreg.r64(), rax); // mov dstreg,rax } // store result if (inst.size() == 4) - mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg + mov_param_reg(a, dstp, dstreg); // mov dstp,dstreg else - mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg + mov_param_reg(a, dstp, dstreg.r64()); // mov dstp,dstreg } @@ -2696,64 +2630,31 @@ void drcbe_x64::op_write(Assembler &a, const instruction &inst) assert(spacesizep.is_size_space()); // set up a call to the write handler - auto &trampolines = m_accessors[spacesizep.space()]; auto &resolved = m_resolved_accessors[spacesizep.space()]; - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp + mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp if (spacesizep.size() != SIZE_QWORD) - mov_reg_param(a, Gpd(REG_PARAM3), srcp); // mov param3,srcp + mov_reg_param(a, Gpd(REG_PARAM3), srcp); // mov param3,srcp else - mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp + mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte.obj); // mov param1,space - smart_call_r64(a, resolved.write_byte.func, rax); // call write_byte - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_byte); // call write_byte - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte.obj); // mov param1,space + smart_call_r64(a, resolved.write_byte.func, rax); // call write_byte } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word.obj); // mov param1,space - smart_call_r64(a, resolved.write_word.func, rax); // call write_word - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_word); // call write_word - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word.obj); // mov param1,space + smart_call_r64(a, resolved.write_word.func, rax); // call write_word } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_dword) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword.obj); // mov param1,space - smart_call_r64(a, resolved.write_dword.func, rax); // call write_dword - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_dword); // call write_dword - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword.obj); // mov param1,space + smart_call_r64(a, resolved.write_dword.func, rax); // call write_dword } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_qword) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword.obj); // mov param1,space - smart_call_r64(a, resolved.write_qword.func, rax); // call write_qword - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_qword); // call write_qword - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword.obj); // mov param1,space + smart_call_r64(a, resolved.write_qword.func, rax); // call write_qword } } @@ -2777,70 +2678,37 @@ void drcbe_x64::op_writem(Assembler &a, const instruction &inst) assert(spacesizep.is_size_space()); // set up a call to the write handler - auto &trampolines = m_accessors[spacesizep.space()]; auto &resolved = m_resolved_accessors[spacesizep.space()]; - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp + mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp if (spacesizep.size() != SIZE_QWORD) { - mov_reg_param(a, Gpd(REG_PARAM3), srcp); // mov param3,srcp - mov_reg_param(a, Gpd(REG_PARAM4), maskp); // mov param4,maskp + mov_reg_param(a, Gpd(REG_PARAM3), srcp); // mov param3,srcp + mov_reg_param(a, Gpd(REG_PARAM4), maskp); // mov param4,maskp } else { - mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp - mov_reg_param(a, Gpq(REG_PARAM4), maskp); // mov param4,maskp + mov_reg_param(a, Gpq(REG_PARAM3), srcp); // mov param3,srcp + mov_reg_param(a, Gpq(REG_PARAM4), maskp); // mov param4,maskp } if (spacesizep.size() == SIZE_BYTE) { - if (resolved.write_byte) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte_masked.obj); // mov param1,space - smart_call_r64(a, resolved.write_byte_masked.func, rax); // call write_byte_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_byte_masked); // call write_byte_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_byte_masked.obj); // mov param1,space + smart_call_r64(a, resolved.write_byte_masked.func, rax); // call write_byte_masked } else if (spacesizep.size() == SIZE_WORD) { - if (resolved.write_word) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word_masked.obj); // mov param1,space - smart_call_r64(a, resolved.write_word_masked.func, rax); // call write_word_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_word_masked); // call write_word_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_word_masked.obj); // mov param1,space + smart_call_r64(a, resolved.write_word_masked.func, rax); // call write_word_masked } else if (spacesizep.size() == SIZE_DWORD) { - if (resolved.write_word) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword_masked.obj); // mov param1,space - smart_call_r64(a, resolved.write_dword_masked.func, rax); // call write_dword_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_dword_masked); // call write_dword_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_dword_masked.obj); // mov param1,space + smart_call_r64(a, resolved.write_dword_masked.func, rax); // call write_dword_masked } else if (spacesizep.size() == SIZE_QWORD) { - if (resolved.write_word) - { - mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword_masked.obj); // mov param1,space - smart_call_r64(a, resolved.write_qword_masked.func, rax); // call write_qword_masked - } - else - { - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacesizep.space()]); // mov param1,space - smart_call_m64(a, (x86code **)&trampolines.write_qword_masked); // call write_qword_masked - } + mov_r64_imm(a, Gpq(REG_PARAM1), resolved.write_qword_masked.obj); // mov param1,space + smart_call_r64(a, resolved.write_qword_masked.func, rax); // call write_qword_masked } } @@ -4431,27 +4299,26 @@ void drcbe_x64::op_fread(Assembler &a, const instruction &inst) assert((1 << spacep.size()) == inst.size()); // set up a call to the read dword/qword handler - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacep.space()]); // mov param1,space - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param2,addrp - if (inst.size() == 4) - smart_call_m64(a, (x86code **)&m_accessors[spacep.space()].read_dword); // call read_dword - else if (inst.size() == 8) - smart_call_m64(a, (x86code **)&m_accessors[spacep.space()].read_qword); // call read_qword + auto const &accessors = m_resolved_accessors[spacep.space()]; + auto const &accessor = (inst.size() == 4) ? accessors.write_dword : accessors.write_qword; + mov_reg_param(a, Gpd(REG_PARAM2), addrp); + mov_r64_imm(a, Gpq(REG_PARAM1), accessor.obj); + smart_call_r64(a, accessor.func, rax); // store result if (inst.size() == 4) { if (dstp.is_memory()) - a.mov(MABS(dstp.memory()), eax); // mov [dstp],eax + a.mov(MABS(dstp.memory()), eax); else if (dstp.is_float_register()) - a.movd(Xmm(dstp.freg()), eax); // movd dstp,eax + a.movd(Xmm(dstp.freg()), eax); } else if (inst.size() == 8) { if (dstp.is_memory()) - a.mov(MABS(dstp.memory()), rax); // mov [dstp],rax + a.mov(MABS(dstp.memory()), rax); else if (dstp.is_float_register()) - a.movq(Xmm(dstp.freg()), rax); // movq dstp,rax + a.movq(Xmm(dstp.freg()), rax); } } @@ -4475,28 +4342,28 @@ void drcbe_x64::op_fwrite(Assembler &a, const instruction &inst) assert((1 << spacep.size()) == inst.size()); // general case - mov_r64_imm(a, Gpq(REG_PARAM1), (uintptr_t)m_space[spacep.space()]); // mov param1,space - mov_reg_param(a, Gpd(REG_PARAM2), addrp); // mov param21,addrp + auto const &accessors = m_resolved_accessors[spacep.space()]; + auto const &accessor = (inst.size() == 4) ? accessors.write_dword : accessors.write_qword; + mov_reg_param(a, Gpd(REG_PARAM2), addrp); - // 32-bit form if (inst.size() == 4) { + // 32-bit form if (srcp.is_memory()) - a.mov(Gpd(REG_PARAM3), MABS(srcp.memory())); // mov param3,[srcp] + a.mov(Gpd(REG_PARAM3), MABS(srcp.memory())); else if (srcp.is_float_register()) - a.movd(Gpd(REG_PARAM3), Xmm(srcp.freg())); // movd param3,srcp - smart_call_m64(a, (x86code **)&m_accessors[spacep.space()].write_dword); // call write_dword + a.movd(Gpd(REG_PARAM3), Xmm(srcp.freg())); } - - // 64-bit form else if (inst.size() == 8) { + // 64-bit form if (srcp.is_memory()) - a.mov(Gpq(REG_PARAM3), MABS(srcp.memory())); // mov param3,[srcp] + a.mov(Gpq(REG_PARAM3), MABS(srcp.memory())); else if (srcp.is_float_register()) - a.movq(Gpq(REG_PARAM3), Xmm(srcp.freg())); // movq param3,srcp - smart_call_m64(a, (x86code **)&m_accessors[spacep.space()].write_qword); // call write_qword + a.movq(Gpq(REG_PARAM3), Xmm(srcp.freg())); } + mov_r64_imm(a, Gpq(REG_PARAM1), accessor.obj); + smart_call_r64(a, accessor.func, rax); } diff --git a/src/devices/cpu/drcbex86.cpp b/src/devices/cpu/drcbex86.cpp index f6e3a3e2a0097..8d5f2b9df4c05 100644 --- a/src/devices/cpu/drcbex86.cpp +++ b/src/devices/cpu/drcbex86.cpp @@ -6234,6 +6234,7 @@ void drcbe_x86::op_fwrite(Assembler &a, const instruction &inst) emit_mov_m32_p32(a, dword_ptr(esp, USE_THISCALL ? 4 : 8), srcp); else if (inst.size() == 8) emit_mov_m64_p64(a, qword_ptr(esp, USE_THISCALL ? 4 : 8), srcp); + emit_mov_m32_p32(a, dword_ptr(esp, USE_THISCALL ? 0 : 4), addrp); if (USE_THISCALL) a.mov(ecx, imm(accessor.obj)); else diff --git a/src/devices/cpu/drcuml.cpp b/src/devices/cpu/drcuml.cpp index 0b2c391e02e10..6d21b262a4a68 100644 --- a/src/devices/cpu/drcuml.cpp +++ b/src/devices/cpu/drcuml.cpp @@ -95,7 +95,6 @@ drcbe_interface::drcbe_interface(drcuml_state &drcuml, drc_cache &cache, device_ , m_device(device) , m_space() , m_state(*reinterpret_cast(cache.alloc_near(sizeof(m_state)))) - , m_accessors(nullptr) { // reset the machine state memset(&m_state, 0, sizeof(m_state)); @@ -105,17 +104,12 @@ drcbe_interface::drcbe_interface(drcuml_state &drcuml, drc_cache &cache, device_ if (device.interface(memory)) { int const count = memory->max_space_count(); - m_accessors = reinterpret_cast(cache.alloc_near(sizeof(*m_accessors) * count)); - memset(m_accessors, 0, sizeof(*m_accessors) * count); m_space.resize(count, nullptr); for (int spacenum = 0; spacenum < count; ++spacenum) { if (memory->has_space(spacenum)) - { m_space[spacenum] = &memory->space(spacenum); - m_space[spacenum]->accessors(m_accessors[spacenum]); - } } } } diff --git a/src/devices/cpu/drcuml.h b/src/devices/cpu/drcuml.h index 81ef59d0f4dd2..b146a6b700d7b 100644 --- a/src/devices/cpu/drcuml.h +++ b/src/devices/cpu/drcuml.h @@ -150,7 +150,6 @@ class drcbe_interface device_t & m_device; // CPU device we are associated with std::vector m_space; // pointers to CPU's address space drcuml_machine_state & m_state; // state of the machine (in near cache) - data_accessors * m_accessors; // memory accessors (in near cache) };