Commit Graph
112 Commits
Author SHA1 Message Date
Henrik RydgårdandClaude Opus 5.5 48973c83c6 Debugger: Show replacement hooks in the disassembly again
Memory no longer holds the hooks, so the disassembly fetches the op the CPU runs, which is the
CallRepl pseudo-op at a hooked address. That lookup can come from the Win32 debugger's UI thread,
so the CPU thread now changes the hook map under a lock (and reads it without, being the only
writer).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 10:33:30 +02:00
Henrik RydgårdandClaude Opus 5.5 6d122f416e Keep JIT block entries and replacement hooks out of PSP memory
The JITs used to find a block by overwriting its first instruction with an "emuhack" holding
the offset into the code space, and replacement functions installed their own emuhack the same
way. Anything that read code (savestates, the debugger, memory dumps, cheats, the function
hasher, games reading their own code) had to translate them back.

Blocks now live in a block shadow: one u32 per guest instruction, indexed by the PC masked with
BLOCK_SHADOW_MASK (1GB on 64-bit, folding the kernel and uncached mirrors; 256MB on 32-bit, iOS
and Switch, where address space is short), with the low bits cleared so a misaligned PC can't
read across two entries. Only the ranges under memory views are committed, so a bad PC still
faults in the dispatcher, and the shadow is reserved before the memory map so it can't land in
a gap of the 4GB window. Entries hold full 32-bit offsets, lifting the 16MB limit. The
dispatchers on every backend, and the IR interpreter's loop, look blocks up there.

A hooked instruction without a compiled block gets the JIT's hook value in its entry: the offset
of the dispatcher's compile path (1 for the interpreters, the IR arena keeping that offset
empty), so dispatching there compiles a block, and the frontends substitute the hook. Compiling
replaces the entry with the block's, and destroying the block puts the hook value back. The hook
value is rewritten when the JIT changes or regenerates its dispatcher.

Hooks live in a map keyed by the masked address, and are dropped when the game overwrites the
hooked instruction, or when an icache invalidation finds the function's hash (immediates masked,
as when matching it) changed. Those checks run when queued invalidations are processed, since
cheats and the debugger queue them before writing. Installing and removing hooks invalidates
deferred, as it happens in HLE calls that can run inside a block. The cache instruction goes
through MIPSState, so it drops changed hooks too.

With clean memory, the save/clear/restore around savestates, memory reads and dumps goes away,
as do the source-range invalidations in the memcpy replacements, sceDmac and the cheats.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 10:33:30 +02:00
Henrik RydgårdandClaude Opus 5.5 59fed92dac IR native: Invalidate linked blocks again
78c75e1a0b dropped IRNativeJit::InvalidateCacheAt as a duplicate, and with it the only call to
the backend's InvalidateBlock. Since then a block linked to an invalidated one kept jumping into
its old code, past the dispatcher. Call it from IRJit::InvalidateCacheAt through a virtual, like
the other native block hooks.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-11 10:33:30 +02:00
Henrik Rydgård eb0813c0e3 Add a utility function for all the ABIs to call functions with a pointer arg. Use to call Advance from the JIT with the MIPSContext. Indent some code better. 2026-08-13 08:09:30 +02:00
Henrik Rydgård e9a3449ede More MIPSState * plumbing (manual) 2026-08-12 14:02:19 +02:00
Henrik RydgårdandClaude Sonnet 5 d718bda178 Rename MIPSInt/MIPSIntVFPU to Interpreter/InterpreterVFPU
Just a file rename (plus updating all build configs and includes) to
give the interpreter source files clearer names. No functional change.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019SKhm9wKEQzRUsx9mTrrtQ
2026-08-12 10:04:40 +02:00
Henrik Rydgård 9396030f02 More Read_U32 cleanup 2026-08-11 09:08:52 +02:00
Henrik Rydgård 68ec34ad54 Build and warning fixes 2026-08-03 19:11:07 +02:00
Henrik Rydgård f0ba391a4e Remove the whole concept of proxy blocks from the block cache, and experimental uses of it. 2026-02-17 09:40:27 +01:00
Henrik Rydgård a72fc6f79c Support showing (and sorting by) IR profiler info in the JIT viewer
This will help future work on #19143 .
2025-10-09 17:02:52 -06:00
Henrik Rydgård ff5dea821b New jit viewer is starting to work a bit. 2025-10-08 16:59:25 -06:00
Henrik Rydgård ba148e5ec7 JIT/IRJit: Delete an old "function preloading" experiment
This caused some confusion while trying to debug #20502
2025-06-11 15:45:18 +02:00
Mark Zhuang ec9401374e IR: Fix compile error when enable IR_PROFILING 2025-05-21 14:04:01 +08:00
Nemoumbra e3b09bea59 Ported the MIPSLogger's UI + basic integration of MIPSTracer 2024-09-14 19:46:05 +03:00
Nemoumbra 00cd142365 Comment fix + new QOL method 2024-09-14 19:46:04 +03:00
Henrik Rydgård b6a3996e65 Remove a warning, change some & params to pointers for clarity, func rename 2024-09-11 11:48:12 +02:00
Henrik Rydgård 7139301692 IR interpreter: Replace the assert for downcount with a very predictable branch
Fixes breakpoints and other similar things, with a negligible penalty.
2024-09-11 11:24:43 +02:00
Henrik Rydgård 96c4ae4457 TimeUtil: Minor cleanup, add precise_sleep() 2024-07-26 11:25:58 +02:00
Henrik Rydgård eda60a5df9 IR: Disable unworkable overwriting of instructions on invalidation. Add debug-mode sanity check. 2024-07-22 12:03:53 +02:00
Henrik Rydgård aa7fd6979e Disable preloading of function stubs if bPreloadFunctions is off
Fixes #19349. Strange that the game worked at all.

The issue is that the arena could get resized due to precompile during
sceKernelModuleLoad . Now respect the flag that turns precompile off
properly (we should probably make it work differently instead, if we're
gonna have it).
2024-07-22 09:51:58 +02:00
Henrik Rydgård 44f3d113d0 Buildfix 2024-07-22 09:08:47 +02:00
Henrik Rydgård 85e7ff7ac3 Target->Native renaming. More intuitive (at least to me) 2024-07-22 01:24:34 +02:00
Henrik Rydgård 898774a93d Attempt more thorough block invalidation 2024-07-22 01:22:54 +02:00
Henrik Rydgård d3e6f19b6d Comments, log, cleanup 2024-07-22 01:15:35 +02:00
Henrik Rydgård 9d36a08ec4 Some renaming, remove a gross hack 2024-07-21 19:12:51 +02:00
Henrik Rydgård fb499bf5bf ARM32: Remove runtime checks for VFPv3 and NEON since we require these when building anyway. 2024-07-17 22:14:24 +02:00
Henrik Rydgård e01ca5b057 Logging API change (refactor) (#19324)
* Rename LogType to Log

* Explicitly use the Log:: enum when logging. Allows for autocomplete when editing.

* Mac/ARM64 buildfix

* Do the same with the hle result log macros

* Rename the log names to mixed case while at it.

* iOS buildfix

* Qt buildfix attempt, ARM32 buildfix
2024-07-14 14:42:59 +02:00
Henrik Rydgård 9ef5250387 IRJit: If we're in "JIT using IR" mode, don't accidentally optimize for the interpreter. 2024-06-11 10:24:08 +02:00
Henrik Rydgård bd0beb68a4 Add new IR optimization pass, OptimizeLoadsAfterStores 2024-06-07 19:32:37 +02:00
Henrik Rydgård a4c4fb44fb Cleanup 2024-06-07 18:33:48 +02:00
Henrik Rydgård 94ef6d4ce7 Fix savestates (oops) 2024-06-07 18:33:40 +02:00
Henrik Rydgård 7ef6cdb515 Improve accuracy of block timing 2024-06-07 10:17:16 +02:00
Henrik Rydgård a6f398a7d2 Add IRJit arena overflow check 2024-06-07 10:17:01 +02:00
Henrik Rydgård 8d6e96d04e Use binary search to find IR block offsets 2024-06-07 09:28:27 +02:00
Henrik Rydgård ee6ba74c88 Store IRInst offsets instead of block indices 2024-06-07 09:28:27 +02:00
Henrik Rydgård 5526ef012c Store IR instructions in a large arena vector instead of loosely in each block. 2024-06-07 09:28:27 +02:00
Henrik Rydgård 0ea9120ca5 Add a stats view 2024-06-06 19:21:50 +02:00
Henrik Rydgård ba1ced77c3 IRJit block profiling basics 2024-06-05 13:02:40 +02:00
Henrik Rydgård f2837e3b55 JIT compare screen with IR blocks - fix some crashing issues 2024-05-26 14:10:50 +02:00
Henrik Rydgård 7464b5f17b IRInterpreter: Enable some optimizations that accidentally were only enabled on non-ARM64. 2024-05-26 13:41:31 +02:00
Henrik Rydgård e75e7a0e43 Add an optimizeForInterpreter flag 2024-05-26 13:41:31 +02:00
Henrik Rydgård fae846e52a Remove the count parameter from IRInterpret. This is a good speed boost! 2024-05-10 23:31:24 +02:00
Henrik Rydgård 7a097cb34a Shave a couple instructions in the common case 2024-05-10 23:23:58 +02:00
Henrik Rydgård c332d564db IRInterpreter: Cache the MIPSState pointer in a local, faster address check 2024-05-10 23:21:51 +02:00
Henrik Rydgård 91d9ef9b81 Minor IR interpreter optimization 2024-05-10 18:27:29 +02:00
Herman Semenov 17ecee1715 Fixed return copies from functions and const ref params 2024-04-02 18:37:00 +03:00
Herman Semenov b871e76d05 [Core/Debugger/FileLoaders/FileSystems/MIPS] Using reserve if possible 2023-12-15 13:59:19 +03:00
Unknown W. Brackets 57123e8f9e irjit: Reserve some arrays that churn.
Improves IR compile time by around 20-30%.
2023-08-20 08:59:47 -07:00
Unknown W. Brackets 159b41a0fa irjit: Fuse unaligned svl.q/svr.q together.
They're almost never used outside paired, which we can do on most
platforms easily.
2023-08-13 18:10:40 -07:00
Unknown W. Brackets 2e6dbab5fa irjit: Add flag to prefer Vec4, use for add/sub.
This will improve things when using SIMD.
2023-08-13 18:10:40 -07:00