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.

Check it out!

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

Written on October 4, 2025