u32 Read_Instruction(u32 address) { u32 inst = Read_U32(address); if (MIPS_IS_EMUHACK(inst) && MIPSComp::jit) return MIPSComp::jit->GetBlockCache()->GetOriginalFirstOp(inst & MIPS_EMUHACK_VALUE_MASK); else return inst; }
static Opcode Read_Instruction(u32 address, bool resolveReplacements, Opcode inst) { if (!MIPS_IS_EMUHACK(inst.encoding)) { return inst; } if (MIPS_IS_RUNBLOCK(inst.encoding) && MIPSComp::jit) { JitBlockCache *bc = MIPSComp::jit->GetBlockCache(); int block_num = bc->GetBlockNumberFromEmuHackOp(inst, true); if (block_num >= 0) { inst = bc->GetOriginalFirstOp(block_num); if (resolveReplacements && MIPS_IS_REPLACEMENT(inst)) { u32 op; if (GetReplacedOpAt(address, &op)) { if (MIPS_IS_EMUHACK(op)) { ERROR_LOG(HLE,"WTF 1"); return Opcode(op); } else { return Opcode(op); } } else { ERROR_LOG(HLE, "Replacement, but no replacement op? %08x", inst.encoding); } } return inst; } else { return inst; } } else if (resolveReplacements && MIPS_IS_REPLACEMENT(inst.encoding)) { u32 op; if (GetReplacedOpAt(address, &op)) { if (MIPS_IS_EMUHACK(op)) { ERROR_LOG(HLE,"WTF 2"); return Opcode(op); } else { return Opcode(op); } } else { return inst; } } else { return inst; } }
__forceinline static Opcode Read_Instruction(u32 address, bool resolveReplacements, Opcode inst) { if (!MIPS_IS_EMUHACK(inst.encoding)) { return inst; } if (MIPS_IS_RUNBLOCK(inst.encoding) && MIPSComp::jit) { inst = MIPSComp::jit->GetOriginalOp(inst); if (resolveReplacements && MIPS_IS_REPLACEMENT(inst)) { u32 op; if (GetReplacedOpAt(address, &op)) { if (MIPS_IS_EMUHACK(op)) { ERROR_LOG(MEMMAP, "WTF 1"); return Opcode(op); } else { return Opcode(op); } } else { ERROR_LOG(MEMMAP, "Replacement, but no replacement op? %08x", inst.encoding); } } return inst; } else if (resolveReplacements && MIPS_IS_REPLACEMENT(inst.encoding)) { u32 op; if (GetReplacedOpAt(address, &op)) { if (MIPS_IS_EMUHACK(op)) { ERROR_LOG(MEMMAP, "WTF 2"); return Opcode(op); } else { return Opcode(op); } } else { return inst; } } else { return inst; } }
Opcode Read_Instruction(u32 address) { Opcode inst = Opcode(Read_U32(address)); if (MIPS_IS_EMUHACK(inst) && MIPSComp::jit) { JitBlockCache *bc = MIPSComp::jit->GetBlockCache(); int block_num = bc->GetBlockNumberFromEmuHackOp(inst, true); if (block_num >= 0) { return bc->GetOriginalFirstOp(block_num); } else { return inst; } } else { return inst; } }
int JitBlockCache::GetBlockNumberFromEmuHackOp(MIPSOpcode inst, bool ignoreBad) const { if (!num_blocks_ || !MIPS_IS_EMUHACK(inst)) // definitely not a JIT block return -1; int off = (inst & MIPS_EMUHACK_VALUE_MASK); const u8 *baseoff = codeBlock_->GetBasePtr() + off; if (baseoff < codeBlock_->GetBasePtr() || baseoff >= codeBlock_->GetCodePtr()) { if (!ignoreBad) { ERROR_LOG(JIT, "JitBlockCache: Invalid Emuhack Op %08x", inst.encoding); } return -1; } int bl = binary_search(blocks_, baseoff, 0, num_blocks_ - 1); if (bl >= 0 && blocks_[bl].invalid) { return -1; } else { return bl; } }