WATaBoy: JIT-Ing Game Boy Instructions to WASM Beats a Native Interpreter
energeticbark
198 points
31 comments
June 29, 2026
Related Discussions
Found 5 related stories in 183.9ms across 14,015 title embeddings via pgvector HNSW
- WASI 0.3 mavdol04 · 240 pts · June 12, 2026 · 55% similar
- GameBoy Workboy tosh · 175 pts · June 13, 2026 · 51% similar
- RISCBoy is an open-source portable games console, designed from scratch mariuz · 99 pts · July 11, 2026 · 49% similar
- WASM on the JVM Ships Under the Bytecode Alliance dustingetz · 28 pts · June 29, 2026 · 48% similar
- I built a Game Boy emulator in F# elvis70 · 250 pts · April 30, 2026 · 47% similar
Discussion Highlights (11 comments)
milch
Very interesting article. Would've been fun to see the comparison between native interpreter & JIT-on-WASM on iOS as well
iberator
yet on real old hardware it would be 20x slower in real life. same as all native javascript junk - its fast, but non usuable on older hardware
dag100
This is an incredible project for an undergraduate. Very impressive. Interesting to note that Firefox is 25% slower than Chrome/Safari, I wonder why.
ahartmetz
Of course it beats a native interpreter. WASM overhead is about 20%, interpreter overhead is about 1000%. What's cool here is to have a GameBoy JIT runtime at all.
jonny_eh
So it's a JIT-in-JIT? JiJIT?
mikepurvis
I've always really enjoyed Andrew Kelley's article about trying to statically recompile NES code from 2013 [1]. Basically he makes a ton of progress but gets hung up not just on the realities of the handwritten assembler of the era just not being all that great at mapping to higher level LLVM IR. In the conclusion he specifically calls out a JIT-type methodology as probably being the way to go, where you live-recompile the hot paths when you have the runtime data required to actually understand them, and don't worry about the parts you can't. Very cool to see something like that in action. [1]: https://andrewkelley.me/post/jamulator.html
lightedman
Still doesn't beat a natively-coded emulator. I got several that run faster on a 166MHz non-MMX Pentium than this emulator does on my Core Ultra i9.
bawolff
> Dolphin isn’t on iOS, because you can’t do JIT compilation on iOS....Well, Apple has one exception to its JIT restrictions: web browsers. JavaScriptCore, WebKit’s JS engine, uses JIT compilation for its higher-performance tiers. So, if a JS function is called enough times, eventually it’ll be optimised and compiled into native machine code. The same is true for WebAssembly. I was wondering about the why of the headline, and this is a really interesting answer. Such a beautiful way to get around restrictions. I wonder how applicable it is to other projects.
jhatemyjob
The author's base assumption, and stated motivation for doing this project, is wrong. https://github.com/StephenDev0/StikDebug For an undergrad project, I suppose it's fine to conveniently forget about the existence of this solution for the sake of getting a good grade.
jcmfernandes
Very cool! I did something similar using Dolphin and LLVM, 16 years ago during my masters, for a course on virtual machines. I compiled the interpreter to LLVM bitcode and then used it that to build basic blocks. It was super slow, but it worked, and I had lots of fun working on it.
Scaevolus
The absolutely easiest way to write a JIT is to use Javascript and eval() (or "new Function()", which is just eval in a Java-shaped tuxedo). You can quite easily speed up little matching functions, especially arithmetic heavy ones, by just filling in some templates at runtime! Here's an example used in PuzzleScript: https://github.com/increpare/PuzzleScript/blob/dc1e0fc979365...