bool Jit::JitSafeMem::PrepareSlowRead(void *safeFunc) { if (!fast_) { if (iaddr_ != (u32) -1) { // No slow read necessary. if (ImmValid()) return false; jit_->MOV(32, R(EAX), Imm32(iaddr_ & alignMask_)); } else { PrepareSlowAccess(); jit_->LEA(32, EAX, MDisp(xaddr_, offset_)); if (alignMask_ != 0xFFFFFFFF) jit_->AND(32, R(EAX), Imm32(alignMask_)); } jit_->CallProtectedFunction(safeFunc, R(EAX)); needsCheck_ = true; return true; } else return false; }
bool Jit::JitSafeMem::PrepareSlowWrite() { // If it's immediate, we only need a slow write on invalid. if (iaddr_ != (u32) -1) return !fast_ && !ImmValid(); if (!fast_) { PrepareSlowAccess(); return true; } else return false; }
bool Jit::JitSafeMem::PrepareSlowWrite() { // If it's immediate, we only need a slow write on invalid. if (iaddr_ != (u32) -1) return !g_Config.bFastMemory && !Memory::IsValidAddress(iaddr_); if (!g_Config.bFastMemory) { PrepareSlowAccess(); return true; } else return false; }
bool Jit::JitSafeMem::PrepareSlowRead(void *safeFunc) { if (!g_Config.bFastMemory) { if (iaddr_ != (u32) -1) { // No slow read necessary. if (Memory::IsValidAddress(iaddr_)) return false; jit_->MOV(32, R(EAX), Imm32(iaddr_)); } else { PrepareSlowAccess(); jit_->LEA(32, EAX, MDisp(xaddr_, offset_)); } jit_->ABI_CallFunctionA(jit_->thunks.ProtectFunction(safeFunc, 1), R(EAX)); needsCheck_ = true; return true; } else return false; }