
The September 2026 MSVC Build Tools Preview targeting v14.52 is the most ISA-comprehensive update the team has shipped since APX support launched. Three ARM64 instruction set extensions land in one release — FEAT_CSSC, FEAT_FAMINMAX, and FEAT_LUT — alongside expanded APX register exploitation on x64 and first-class tail-call support via __preserve_none and [[msvc::musttail]]. If you write performance-critical C++ for Windows, this is the build to pull.
ARM64 Gets Three ISA Extensions at Once
The headline on ARM64 is not one extension — it’s three shipping together, each targeting a different class of workload.
FEAT_CSSC (Common Short Sequence Compression, introduced in Armv8.9) is the broadly applicable one. It adds hardware instructions for operations that previously required two to four-instruction sequences: absolute value of a signed integer (ABS) and count trailing zeros (CTZ). CTZ carries a data-independent-time guarantee — relevant if you’re doing anything crypto-adjacent. These aren’t glamorous instructions, but they show up constantly in numeric, bitfield, and hashing code. Single-instruction ABS alone will quietly improve a lot of hot paths.
FEAT_FAMINMAX adds FAMAX and FAMIN — vector instructions that compute floating-point absolute maximum and minimum element-wise in a single SIMD operation. Previously you needed a FABS followed by FMAX or FMIN. The compression is one instruction. The target is ML inference kernels, DSP pipelines, and normalization passes: workloads running through SIMD-heavy inner loops where saving one instruction per element adds up fast.
FEAT_LUT adds LUTI4 vector lookup-table instructions and extends LUTI2 (added in August’s preview) with bfloat16 support. The lookup-table instructions are especially useful for AES S-box substitution, gamma correction tables, codec-level byte mappings, and ML quantization schemes. MSVC already shipped LUTI2 last month; this update completes the picture.
All three require ARM hardware that supports the relevant extensions — Armv8.9+ for FEAT_CSSC, Armv9.2+ for FEAT_FAMINMAX and FEAT_LUT. Snapdragon X Elite, newer AWS Graviton generations, and Azure Cobalt instances are in scope.
Tail Calls Are Now First-Class: __preserve_none and [[msvc::musttail]]
This is the one interpreter and state-machine authors have been waiting for. MSVC now supports __preserve_none as a calling convention attribute and [[msvc::musttail]] as a guaranteed-tail-call annotation, both in the same release.
__preserve_none tells the compiler that a function preserves no callee-saved registers. The function prologue and epilogue disappear entirely. Combined with [[msvc::musttail]], which forces the compiler to emit a jmp rather than a call/ret pair (and errors if it can’t), you get zero-overhead dispatch chains: no stack growth, no register save/restore, just an unconditional jump to the next handler.
[[msvc::noinline]]
__preserve_none int handle_add(int a, int b);
__preserve_none int handle_mul(int a, int b) {
if (a == 0) [[msvc::musttail]] return handle_add(a, b);
return a * b;
}
This pattern is already validated in production. CPython added a __preserve_none-based tail-call interpreter and saw meaningful dispatch speedups. The Protobuf parser used a structurally identical pattern to hit 2+ GB/s parse throughput. MSVC’s implementation brings the same technique to the Windows toolchain without relying on Clang or GCC.
One caveat: __preserve_none functions cannot call functions with standard calling conventions without explicitly saving state. The pattern works best when the entire dispatch chain is annotated consistently.
APX: More Register Pressure Relief on x64
Intel APX (Advanced Performance Extensions) doubles the x64 general-purpose register count from 16 to 32. MSVC has been building up APX support across several releases; September’s update adds a new aliased copy-propagation pass that detects when a move-then-operate sequence can fold into APX’s 3-operand instruction form — eliminating the intermediate register entirely.
The downstream effect: Intel’s published numbers show 10% fewer loads and more than 20% fewer stores in APX-compiled code compared to baseline x64. You need APX-capable hardware to run the output (Intel Granite Rapids or newer; AMD’s APX-compatible roadmap is in progress after the joint standardization announcement), but the compiler can generate APX code today against future hardware.
C++ Modules and AddressSanitizer
Two reliability improvements worth noting. C++ modules get better type merging when header units are shared across multiple module compilation units, plus improved template serialization. If you’ve hit mysterious type-mismatch errors in multi-module builds, this release is worth testing against your project.
AddressSanitizer gains a new diagnostic for incompatible use with /clr — previously the incompatibility surfaced as a runtime failure rather than a compile-time error. Several internal compiler errors (ICEs) in the frontend are also fixed in this build.
How to Get It
Two acquisition paths from aka.ms/msvc/preview:
- Visual Studio 2026 Insiders Channel — MSVC Preview updates roughly weekly. Fastest way to track v14.52 progress.
- Visual Studio 2026 Stable Channel — Less frequent; pick this if you want preview features with more soak time.
After installing, verify the version: cl.exe should report at least 19.52.36725. The full changelog is on the C++ Team Blog.
The ARM64 ISA additions and the tail-call improvements are the two concrete reasons to move on this now. The APX work compounds over time — generate the code today, profile it against future hardware when it lands.













