bool jit_fallback(PPCEmuAssembler& a, Instruction instr) { auto data = gInstructionTable.decode(instr); auto fptr = cpu::interpreter::getInstructionHandler(data->id); if (!fptr) { throw; } if (TRACK_FALLBACK_CALLS) { a.mov(a.zax, reinterpret_cast<intptr_t>(&sFallbackCalls[static_cast<uint32_t>(data->id)])); a.lock(); a.inc(asmjit::X86Mem(a.zax, 0)); } a.mov(a.zcx, a.state); a.mov(a.edx, (uint32_t)instr); a.call(asmjit::Ptr(fptr)); return true; }
bool jit_fallback(PPCEmuAssembler& a, espresso::Instruction instr) { auto data = espresso::decodeInstruction(instr); decaf_assert(data, fmt::format("Failed to decode instruction {:08X}", instr.value)); auto fptr = cpu::interpreter::getInstructionHandler(data->id); decaf_assert(fptr, fmt::format("Unimplemented instruction {}", static_cast<int>(data->id))); a.evictAll(); if (TRACK_FALLBACK_CALLS) { auto fallbackAddr = reinterpret_cast<intptr_t>(&sFallbackCalls[static_cast<uint32_t>(data->id)]); a.mov(asmjit::x86::rax, asmjit::Ptr(fallbackAddr)); a.lock().inc(asmjit::X86Mem(asmjit::x86::rax, 0)); } a.mov(a.sysArgReg[0], a.stateReg); a.mov(a.sysArgReg[1], (uint32_t)instr); a.call(asmjit::Ptr(fptr)); return true; }