a093ffec37
subrepo: subdir: "deps/lightrec" merged: "a7bd81d3" upstream: origin: "https://github.com/pcercuei/lightrec.git" branch: "master" commit: "16a375e4" git-subrepo: version: "0.4.3" origin: "https://github.com/ingydotnet/git-subrepo" commit: "2f68596" |
||
---|---|---|
.. | ||
.gitignore | ||
.gitrepo | ||
blockcache.c | ||
blockcache.h | ||
CMakeLists.txt | ||
config.h | ||
config.h.cmakein | ||
COPYING | ||
debug.h | ||
disassembler.c | ||
disassembler.h | ||
emitter.c | ||
emitter.h | ||
interpreter.c | ||
interpreter.h | ||
lightrec-private.h | ||
lightrec.c | ||
lightrec.h | ||
memmanager.c | ||
memmanager.h | ||
optimizer.c | ||
optimizer.h | ||
README.md | ||
reaper.c | ||
reaper.h | ||
recompiler.c | ||
recompiler.h | ||
regcache.c | ||
regcache.h | ||
slist.h |
Lightrec
Lightrec is a MIPS-to-everything dynamic recompiler for PlayStation emulators, using GNU Lightning as the code emitter.
As such, in theory it should be able to run on every CPU that Lightning can generate code for; including, but not limited to, x86, x86_64, ARM, Aarch64, MIPS, PowerPC and Risc-V.
Features
-
High-level optimizations. The MIPS code is first pre-compiled into a form of Intermediate Representation (IR). Basically, just a single-linked list of structures representing the instructions. On that list, several optimization steps are performed: instructions are modified, reordered, tagged; new meta-instructions can be added, for instance to tell the code generator that a certain register won't be used anymore.
-
Lazy compilation. If Lightrec detects a block of code that would be very hard to compile properly (e.g. a branch with a branch in its delay slot), the block is marked as not compilable, and will always be emulated with the built-in interpreter. This allows to keep the code emitter simple and easy to understand.
-
Run-time profiling. The generated code will gather run-time information about the I/O access (whether they hit RAM, or hardware registers). The code generator will then use this information to generate direct read/writes to the emulated memories, instead of jumping to C for every call.
-
Threaded compilation. When entering a loading zone, where a lot of code has to be compiled, we don't want the compilation process to slow down the pace of emulation. To avoid that, the code compiler optionally runs on a thread, and the main loop will emulate the blocks that have not been compiled yet with the interpreter. This helps to drastically reduce the stutter that typically happens when a lot of new code is run.
Emulators
Lightrec has been ported to the following emulators: