How does x86 translation work on Windows on Arm?

Lots of Windows applications were written for x86, and yet can work on Arm CPUs. Here’s how it’s possible.

Microsoft Windows 11 on a tablet computer

Windows 11 running on a foldable tablet device

Windows has always been made for x86 CPUs from Intel and AMD, but ever since Windows RT came out a decade ago for smartphones, the operating system has slowly been becoming more friendly to Arm CPUs. Today, both Windows 10 and Windows 11 offer complete support for Arm CPUs, but there’s a catch. While the operating system itself runs just fine on these CPUs, most applications haven’t launched an Arm-compatible version. Although Windows can run on Arm chips, having few programs to actually use would be a problem.

However, Microsoft has a trick up its sleeve: an emulator to get x86 apps running on Arm-based machines. It’s the key thing that has given Windows on Arm its momentum since the translator came out in 2017. Here’s how the emulator works, and why Arm PCs need to use it if they want to run software made for x86 chips.

Emulating x86 code for Arm CPUs in real time

The idea of emulating code made for one kind of processor so it can be run on another is nothing new. This is how game emulation works, which is popularly used for getting old video games to run on new devices with vastly different hardware. When you run an x86 app on an Arm PC, Windows takes blocks of the app’s code and compiles it into something that can run on an Arm chip. This is all done in real-time, and Windows has to cache all the code it’s translated, meaning that it doesn’t have to retranslate over and over again.

Unfortunately, performance is going to be worse on emulated apps compared to the code designed for the hardware. It’s hard to say how much performance you’re losing by running emulated code on Windows as the testing data is very sparse, but for comparison, Apple’s Rosetta 2 translator (which also translates x86 apps into Arm) loses about 20%. It’s possible to whittle that number down, but usually, emulation and translation result in a performance penalty no matter what.

Why x86 applications can’t run on Arm without emulation

Intel Alder Lake H series processors

You might be wondering why software needs to be written specifically for x86, Arm, and other kinds of CPUs. It comes down to the difference in architecture, and in this case, we’re talking about the instruction-set architecture (ISA). They’re the most fundamental design of a processor and determine whether something simple like multiplication or something complex like AVX can be done natively. Changing the ISA affects the most fundamental way software interacts with hardware, down to the basic ones and zeroes that the CPU reads.

x86 is the ISA of Intel and AMD CPUs, which have historically been the only CPUs that Windows can even run on. Arm, meanwhile, has mostly been used for smartphones, and the overlap between PC software and phone software is very little. Naturally, most programs are either made for x86 or Arm, and for Windows on Arm, this was a massive problem because translation didn’t come out in 2020, while Windows RT (the first version of Windows to support Arm) came out in 2012.

It’s been about a decade since Windows started supporting Arm, so where are all the native apps? The primary issue is that it takes time and expertise to rewrite software for a different ISA, especially if developers want to do it well. Developers that don’t take the proper care to port an app from one ISA to another can result in glitches and bugs. A great example of this is Photoshop for Windows on Arm. It runs natively on Windows on Arm, yet in our review of the Lenovo Thinkpad X13s, we encountered several errors and lots of warnings that OpenCL and OpenGL weren’t supported. Coupled with a much smaller user base using Arm on Windows, there’s less of an incentive for developers to care.

So, when developers can’t or won’t devote the resources to creating native software, the alternative is emulation. Although translating x86 apps for Windows on Arm isn’t perfect, it’s impressive that it works at all, and sometimes losing performance is worth knowing the app will run as expected. At least until Windows on Arm hits the point where developers can no longer ignore it, translation and emulation give it a much-needed boost to its hardware-software ecosystem.