Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Checking <Isa>.X64.IsSupported, where <Isa> refers to the classes in the System.Runtime.Intrinsics.X86 namespace, may now produce a different result to previous versions of .NET.
Tip
ISA stands for Instruction Set Architecture.
Version introduced
5.0
Change description
In previous versions of .NET, some of the System.Runtime.Intrinsics.X86 hardware-intrinsic types, for example, System.Runtime.Intrinsics.X86.Aes, didn't expose a nested X64 class. For these types, calling <Isa>.X64.IsSupported resolved to an IsSupported property on a nested X64 class of a parent class of <Isa>. This meant that the property could return true even when <Isa>.IsSupported returns false.
In .NET 5 and later versions, all of the System.Runtime.Intrinsics.X86 types expose a nested X64 class that appropriately reports support. This ensures that the general hierarchy remains correct, and that if <Isa>.X64.IsSupported is true, then <Isa>.IsSupported can also be assumed to be true.
Reason for change
It was intended that if <Isa>.X64.IsSupported is true, <Isa>.IsSupported is also implied to be true. However, due to how member resolution works in C#, classes that didn't have a nested X64 class exposed a situation where this wasn't always the case and led to bugs in user code.
Recommended action
If necessary, adjust code that checks IsSupported to check for the appropriate ISA.
Affected APIs
- System.Runtime.Intrinsics.X86.Aes.X64.IsSupported
- System.Runtime.Intrinsics.X86.Avx.X64.IsSupported
- System.Runtime.Intrinsics.X86.Avx2.X64.IsSupported
- System.Runtime.Intrinsics.X86.Fma.X64.IsSupported
- System.Runtime.Intrinsics.X86.Pclmulqdq.X64.IsSupported
- System.Runtime.Intrinsics.X86.Sse3.X64.IsSupported
- System.Runtime.Intrinsics.X86.Ssse3.X64.IsSupported