felix86 25.10
Welcome to another monthly blog post! This month we made optimizations and fixed a bunch of 32-bit games!
But first, we have an important announcement to make!
RISC-V Summit North America
We’re going to be presenting at the RISC-V Summit North America on October 23, 2025. The presentation will be about how we emulate x86 on RISC-V, focusing on the low-level translation aspects.
x87 performance and compatibility improvements
As promised last month, we worked hard on improving x87 performance. We also fixed a few bugs along the way!
Stack optimizations
x87 registers are accessed like a stack. It consists of a “stack pointer” that points to one of eight registers. Then, whenever an instruction refers to st0
, it refers to the register at that pointer, st1
is the one right after, and so on. In RISC-V, we have to model that with memory loads and stores. We tried allocating the stack on registers and moving them around on push and pop operations but it was bad for performance as push and pop are very frequent.
The new solution involves a couple optimizations. First, if we already loaded a register, we don’t load it again on further uses. If we use st1
, it will get loaded from memory, then if two new values are pushed and we use st3
, the register that was previously allocated for st1
will be used. The second optimization is that if we push values to the stack we don’t actually modify the top, tag word or stack until the end of the block. We keep track of what was pushed and do all the modifications at the end, saving on redundant stores.
Bug fixes
We had a few bugs with our FPU tag word handling. After fixing them and verifying the correct behavior with tests, a bunch of older titles can now run on felix86. Titles include Far Cry, DOOM 3, Assassin’s Creed and others.
Hitman: Blood Money is now playable on felix86 25.10
Future work
The x87 registers support 80-bit floats and some games rely on this extra precision to function. Felix86 uses normal 64-bit floats to emulate them, which is fine for most but not all games. We plan to emulate this extra precision mode eventually.
32-bit signals
Felix86 now has some preliminary support for 32-bit signals, allowing games that use trivial signals to work. More testing is necessary, as well as supporting legacy x86 signal frames that some games use.
Thanks for reading this post.
If you like this project, please give us a star on Github: https://github.com/OFFTKP/felix86