|
1 | 1 | --- |
2 | | -title: Program Compatibility Troubleshooter on Arm |
3 | | -description: Guidance for adjusting compatibility settings if your app isn't working correctly on Arm |
4 | | -ms.date: 11/06/2025 |
| 2 | +title: Adjust Emulation Settings on Arm |
| 3 | +description: Guidance for adjusting compatibility settings if your app isn't working correctly on Arm. |
| 4 | +ms.date: 12/05/2025 |
5 | 5 | ms.topic: troubleshooting-general |
6 | 6 | ms.service: windows |
7 | 7 | ms.subservice: arm |
8 | 8 | ms.reviewer: marcs |
9 | 9 | --- |
10 | 10 |
|
11 | | -# Program Compatibility Troubleshooter on Arm |
| 11 | +# Adjust emulation settings on Arm |
12 | 12 |
|
13 | | -PCs powered by Arm provide great application compatibility and allow you to run your existing unmodified x86 Win32 applications. Arm apps run natively without any emulation, while x86 and x64 apps run under emulation on Arm devices. |
| 13 | +Windows on Arm PCs support running x86 and x64 applications under emulation by using [Prism](./apps-on-arm-x86-emulation.md). Prism includes many optimizations to ensure that emulation is fast and performant for a good user experience. |
14 | 14 |
|
15 | | -However, sometimes the emulation performs optimizations that don't result in the best user experience. You can use the **Program Compatibility Troubleshooter** to toggle emulation settings for your x86 or x64 app, reducing the default optimizations and potentially increasing compatibility. |
| 15 | +By default, Prism strikes the optimal balance between performance optimizations and app compatibility. In the uncommon event that an app has compatibility issues running under Prism, Windows provides optional emulation settings that you can use to tweak the behavior and optimizations that Prism uses for the app. Changing these settings can potentially increase compatibility for an application, generally at the cost of performance. |
16 | 16 |
|
17 | | -## Start the Program Compatibility Troubleshooter |
| 17 | +> [!WARNING] |
| 18 | +> Changing emulation settings might cause your application to unexpectedly crash or not launch at all. |
18 | 19 |
|
19 | | -You start the [Program Compatibility Troubleshooter](https://support.microsoft.com/help/15078/windows-make-older-programs-compatible) manually in the same way on any Windows PC: right-click an executable (.exe) file and select **Troubleshoot compatibility**. You will then have the option to *Try recommended settings* to test run the program using recommended compatibility settings or *Troubleshoot program* to choose compatibility settings based on specific problems that you've noticed. |
| 20 | +## Open emulation settings |
20 | 21 |
|
21 | | - |
| 22 | +You can reach the emulation settings by right-clicking on the executable for an app and selecting **Properties**. |
22 | 23 |
|
23 | | -If you select **Troubleshoot program**, you will have the option to select: |
| 24 | +When you use Windows on Arm, the **Compatibility** tab includes a section titled Windows on Arm. Select **Change emulation settings** to open an Arm emulation settings window. |
24 | 25 |
|
25 | | -- The program worked in earlier versions of Windows but won't install or run now |
26 | | -- The program opens but doesn't display correctly |
27 | | -- The program requires additional permissions |
28 | | -- I don't see my problem listed |
| 26 | + |
29 | 27 |
|
30 | | - |
| 28 | +## Restoring previous emulator behavior |
31 | 29 |
|
32 | | -All options enable the settings that are applicable and applied on Windows Desktop PCs. In addition, the first, second, and fourth options apply the `Disable application cache` and `Disable hybrid execution mode` emulation settings. (See the emulation settings table below for descriptions.) |
| 30 | +Windows on Arm continues to improve and evolve over time. If an application encounters an issue but worked on a previous version of Windows on Arm, overriding Prism's behavior to match that of a previous version of Windows on Arm might resolve the issue. |
33 | 31 |
|
34 | | -## Toggling emulation settings |
| 32 | +### Hide x64 emulation capability |
35 | 33 |
|
36 | | -> [!WARNING] |
37 | | -> Changing emulation settings may result in your application unexpectedly crashing or not launching at all. |
| 34 | +When you select this option, x86 applications see that x64 code can't run on this device. This option imitates the emulator's app support as it existed on Windows 10 on Arm. |
38 | 35 |
|
39 | | -You can toggle emulation settings by right-clicking the executable and selecting **Properties**. |
| 36 | +### Hide newer emulated CPU features |
40 | 37 |
|
41 | | -On Arm, a section titled **Windows 10 on Arm** or **Windows 11 on Arm** will be available in the **Compatibility** tab. Select **Change emulation settings** to launch an Emulations Properties window. |
| 38 | +In Windows 11 24H2 and newer, Prism supports additional CPU features that previous versions of Windows on Arm didn't support. These features include AVX and AVX2, as well as BMI, FMA, F16C, and other related x86 instruction set extensions. |
42 | 39 |
|
43 | | - |
| 40 | +When you select this option for an app, the emulator returns to the level of CPU feature support that existed in the previous version of Prism. |
44 | 41 |
|
45 | | -This Emulations Properties window provides two ways to modify emulation settings. You may select a pre-defined group of emulation settings or select the **Use advanced settings** option to enable choosing individual settings. |
| 42 | +For 32-bit x86 apps, this option is replaced with one to **Show newer emulated CPU features**. By default, Prism doesn't expose the CPU features mentioned earlier to 32-bit x86 apps. When you select this option, a 32-bit x86 app can detect and use the updated CPU feature set. |
46 | 43 |
|
47 | | -The following emulation settings reduce performance optimizations in favor of quality and can be used to experiment with testing your x86 or x64 app's compatibility when running in Windows on Arm. |
| 44 | +## Emulation settings |
48 | 45 |
|
49 | | - |
| 46 | +The Arm emulation settings window provides two ways to modify emulation settings. You can select a predefined group of emulation settings or select the **Use advanced settings** option to enable picking and choosing individual settings. |
50 | 47 |
|
51 | | -Select **Use advanced settings** to choose individual settings as described in this table. |
| 48 | +The four predefined groups of emulation settings are: |
| 49 | +* Default |
| 50 | +* Safe |
| 51 | +* Strict |
| 52 | +* Very strict |
52 | 53 |
|
53 | | -| Emulation setting | Result | |
54 | | -| ----------------- | ----------- | |
55 | | -| Disable application cache | The operating system will cache compiled blocks of code to reduce emulation overhead on subsequent executions. This setting requires the emulator to recompile all app code at runtime. | |
56 | | -| Disable hybrid execution mode | Compiled Hybrid Portable Executable (CHPE), binaries are x86 compatible binaries that include native Arm64 code to improve performance, but that may not be compatible with some apps. This setting forces use of x86-only binaries. | |
57 | | -| Additional lightweight emulation protections | A catch-all update affecting things like volatile metadata which can impact performance when running an x86 or x64 app in emulation. | |
58 | | -| Strict self-modifying code support | Enable this to ensure that any self-modifying code is correctly supported in emulation. The most common self-modifying code scenarios are covered by the default emulator behavior. Enabling this option significantly reduces performance of self-modifying code during execution. | |
59 | | -| Disable RWX page performance optimization | This optimization improves the performance of code on readable, writable, and executable (RWX) pages, but may be incompatible with some apps. | |
60 | | -| Disable JIT optimization (x64 apps only) | This is no longer used and will be removed in future versions of the Troubleshooter. | |
61 | | -| Disable floating point optimization (x64 apps only) | Check to emulate x87 floating point at a full 80-bit precision, but at a performance cost. x87 is a floating-point coprocessor used in some older x86 processors to perform floating-point arithmetic using an 80-bit floating point format with higher precision than the 32-bit or 64-bit format. | |
| 54 | +Moving from Default to Safe to Strict to Very strict sets additional emulation settings, trading off performance for potentially increasing compatibility. |
62 | 55 |
|
63 | | -You can also change how the application uses multiple CPU cores, selecting between Fast, Strict multi-core operation, Very strict, or Force single-core operation. Test your apps emulation when running Windows on Arm with these settings if you notice compatibility issues. |
| 56 | + |
| 57 | + |
| 58 | +If you select **Use advanced settings**, you can change how the application uses multiple CPU cores, selecting between Fast, Strict multi-core operation, Very strict, or Force single-core operation. |
| 59 | + |
| 60 | +The multi-core settings change how Prism uses memory barriers to synchronize memory accesses between cores in apps during emulation. Fast is the default mode, which is the optimal balance for majority of apps. The strict and very strict options will increase the number of barriers, slowing down the app but reducing the risk of app errors. The single-core option removes all barriers but forces all app threads to run on a single core to avoid the need for synchronization. |
64 | 61 |
|
65 | 62 |  |
66 | 63 |
|
67 | | -These settings change the number of memory barriers used to synchronize memory accesses between cores in apps during emulation. **Fast** is the default mode, but the **strict** and **very strict** options will increase the number of barriers. This slows down the app, but reduces the risk of app errors. The **single-core** option removes all barriers but forces all app threads to run on a single core. |
| 64 | +The remaining emulation settings are described in this table. |
| 65 | + |
| 66 | +| Emulation setting | Result | |
| 67 | +| ----------------- | ----------- | |
| 68 | +| Disable application cache | The operating system caches compiled blocks of code to reduce emulation overhead on subsequent executions. This setting requires the emulator to recompile all app code at runtime. | |
| 69 | +| Disable hybrid execution mode (x86 apps only) | Compiled Hybrid Portable Executable (CHPE) binaries are x86 compatible binaries that include native Arm64 code to improve performance, but might not be compatible with some apps. This setting disables use of these hybrid binaries in favor of pure x86-only binaries. | |
| 70 | +| Additional lightweight emulation protections | This setting causes Prism to ignore the presence of any [volatile metadata](/cpp/build/reference/volatile) in a binary. | |
| 71 | +| Strict self-modifying code support | Enable this setting to ensure that any self-modifying code is correctly supported in emulation. The most common self-modifying code scenarios are covered by the default emulator behavior. Selecting this option significantly reduces performance of self-modifying code during execution. | |
| 72 | +| Disable RWX page performance optimization | This setting disables an optimization that improves performance of code on readable, writable, and executable (RWX) pages, but might be incompatible with some apps. | |
| 73 | +| Disable floating point optimization | x87 is an x86 instruction set extension, used primarily in some older x86 software to perform floating point arithmetic, which can use a higher-precision 80-bit floating point format that is not required for most sofware that uses x87. Selecting this option will have Prism use the full 80-bit precision instead of a 64-bit approximation, at the cost of performance. | |
| 74 | + |
68 | 75 |
|
69 | | -If changing a specific setting resolves your issue, please email *[email protected]* with details, so that we may incorporate your feedback. |
|
0 commit comments