DevNews

FEX 2608 Makes ARM Chips Idle Properly While Emulating x86

On this page
  1. Why a busy loop is an emulator's problem
  2. The rest of the release
  3. One upgrade note that will bite somebody
  4. Sources and further reading

FEX 2608 shipped on August 4, and the change worth understanding is a power one. When emulated x86 code spins waiting on an atomic, FEX now uses the ARM WFE instruction under Wine, which drops the core into a low power state instead of burning cycles in a busy loop. The project says this can shave watts off affected workloads. Alongside that there are 256-bit SVE improvements, a fix for AVX state being saved and restored incorrectly across signals, two Wine bugs involving VirtualProtect and untracked threads, and the removal of the deprecated FEXInterpreter binary.

The short answer

FEX 2608 is out. The headline change is that spinloops under Wine now use WFE, so an ARM core waiting on an atomic drops into a low power state rather than spinning, which the project says can save watts. The release also brings 256-bit SVE improvements, a fix for AVX state across signal handling, Wine fixes for VirtualProtect failures and untracked threads, and instruction level JIT work. The deprecated FEXInterpreter binary has been removed.

WFEthe ARM instruction now used for spinloops under Wine
7instructions for VMOVMASKPD and PS, down from 11 and 10
Aug 4the FEX 2608 release date
Answer card: FEX 2608, released August 4 2026, implements spinloops under Wine using the ARM WFE instruction so the core enters a low power state while waiting on an atomic, adds 256-bit SVE improvements, fixes AVX signal state save and restore, and removes the deprecated FEXInterpreter binary after nearly a year.
The shape of the FEX 2608 release. Source: the FEX project release notes and Phoronix reporting. PNG

Emulator release notes are usually a list of compatibility fixes. This one contains a change about doing nothing efficiently, which is a better problem than it sounds.

FEX, the Valve sponsored emulator for running x86_64 binaries on ARM64, published its 2608 release on August 4. The change we would point at first concerns spinloops. When emulated code sits in a tight loop waiting for an atomic to change, FEX now implements that wait under Wine using WFE, the ARM instruction that parks the core in a low power state until an event arrives. The project's own description is that this can shave watts off affected applications.

Why a busy loop is an emulator's problem

A spinlock is a reasonable thing for a program to do. The thread expects the wait to be short, shorter than the cost of going to the kernel and being scheduled back, so it loops and checks rather than sleeping.

The trouble is what a spin costs on the host. The binary was compiled for x86, where the idiom includes a PAUSE hint telling the processor that this is a spin and it should back off. Translate that naively to ARM64 and you get a loop hammering a memory location at full speed with nothing telling the core to relax. Multiply by a game with several threads coordinating, and you have cores at full power doing nothing at all.

Using WFE closes that gap. The loop reads once, then waits for an event, and the core sits in a low power state until the exclusive monitor is cleared or something signals it. The semantics the emulated program sees are unchanged. The energy profile is not.

On a desktop this is a number on a power meter. On an ARM64 laptop or a handheld, which is exactly where people run FEX, it is battery life and fan noise.

The rest of the release

Terminal card showing how to check an ARM64 system before upgrading to FEX 2608: confirming the installed FEX version, checking whether the CPU reports SVE support and at what vector length, and grepping local scripts and binfmt registrations for the removed FEXInterpreter binary name.
Two checks worth running before you upgrade: your SVE vector length, and whether anything still calls FEXInterpreter. PNG

The Wine fixes are the practical ones. VirtualProtect could fail where it should have succeeded, and untracked threads could cause thread local storage tracking to go wrong. Both are the class of bug that presents as a mysterious crash in one specific application rather than something you can attribute.

AVX signal state was being saved and restored incorrectly, which produced crashes on incorrect state transitions. If you have been carrying an unexplained crash in an AVX heavy application, this is worth testing against.

On the JIT side there is work for hardware with 256-bit SVE, a pile of edge case fixes, and instruction level optimisation. The concrete example given is VMOVMASKPD and VMOVMASKPS, which now compile to seven instructions instead of eleven and ten. That is the ordinary, cumulative work of an emulator: nobody notices any single one of those, and together they are why this year's build is faster than last year's.

One upgrade note that will bite somebody

FEXInterpreter is gone. It was deprecated for close to a year and 2608 removes it.

That is fine if you invoke FEX interactively. It is not fine if the old name is buried in a binfmt_misc registration, a wrapper script, a container image or a CI job, because the failure arrives later, in a context where the connection to the upgrade is not obvious. The fix is a rename to the newer FEX binary name. The work is finding every place you wrote it down.

Search your configuration before you update, not after. That is a five minute job now and a confusing afternoon later.

Sources and further reading

Frequently asked questions

What does the WFE instruction actually do?

WFE stands for Wait For Event. It is an ARM instruction that puts the core into a low power state until something wakes it: another core signalling an event, an interrupt, or the exclusive monitor being cleared. The classic use is a spinlock. Instead of a tight loop that reads a memory location as fast as the core can go, the loop reads once, then executes WFE and stops doing anything until there is a reason to look again. The waiting is the same from the software's point of view. The energy cost is not. x86 has a rough equivalent in PAUSE and, on newer parts, in the MONITOR and MWAIT pair, but the compiled binary FEX is emulating was built for x86 and does not know it has landed on ARM.

Will this make my games run faster?

Probably not in frames per second, and the project does not claim it will. This is a power change, not a throughput change. What it improves is what your machine does with the time a thread spends waiting, and on a laptop or a handheld that translates into battery and heat rather than performance. Where you might see a secondary throughput effect is on thermally limited hardware, because a core that is not spinning is a core not generating heat that eventually forces a clock reduction elsewhere. Treat that as a plausible side effect rather than the point.

What is FEX and how does it differ from the other x86 on ARM options?

FEX is an open source emulator, sponsored by Valve, that runs x86 and x86_64 Linux binaries on ARM64 hosts. Its centre of gravity is desktop and gaming workloads, which is why so much of each release concerns Wine and Proton: the common case is an ARM Linux machine running a Windows game through Proton, with FEX underneath translating the x86 instructions. Other projects in this space exist and make different trade offs, notably around how much they translate ahead of time versus at run time and how faithfully they reproduce x86 memory ordering. If your workload is games and desktop applications on ARM64 Linux, FEX is the one whose release notes are worth reading every month.

I use FEXInterpreter in scripts. What breaks?

The FEXInterpreter binary is gone in 2608 after roughly a year of being deprecated. If you have wrapper scripts, systemd units, binfmt_misc registrations or CI jobs that invoke it by name, they will fail after upgrading, and they will fail at the point of use rather than at install time. Grep your configuration for the old name before you update rather than after. The replacement is the newer FEX binary name, and the migration is a rename rather than a change in behaviour, which is exactly the kind of upgrade that is trivial when you plan it and annoying when you do not.

Does the 256-bit SVE work matter on the hardware I own?

Only if your chip implements SVE at a 256-bit vector length, which is far from universal. Plenty of shipping ARM64 hardware implements SVE at 128 bits, where the wider path is not exercised, and some implements no SVE at all. The reason the work matters to the project is that AVX on x86 is 256-bit, so a host with a 256-bit vector length can map those operations far more directly instead of splitting them. If you want to know what you have, check the vector length your kernel reports rather than assuming from the marketing name of the SoC.