所有 Arm64 SVE 非故障加载 API 都已更新为在第一个参数位置包含mask。 此更改会影响类LoadVector*NonFaulting中名称包含System.Runtime.Intrinsics.Arm.Sve的所有方法。
引入的版本
.NET 10
以前的行为
以前,无故障加载 API 仅输入地址参数并载入了一整个向量。
Vector<short> result = Sve.LoadVectorByteNonFaultingZeroExtendToInt16(address);
要使用掩盖掉的元素进行无故障加载,必须使用 ConditionalSelect:
Vector<short> maskedResult = Sve.ConditionalSelect(
mask,
Sve.LoadVectorByteNonFaultingZeroExtendToInt16(address),
zero);
新行为
从 .NET 10 开始,非自动加载 API 需要掩码参数作为第一个参数。
若要为所有元素执行无故障加载,请创建并传递全真值掩码:Sve.LoadVector*NonFaulting*(Sve.CreateTrueMask*(), addr);
破坏性变更的类型
更改原因
此更改是必需的,因为非故障加载会根据加载的向量信道来更新首个故障寄存器(FFR)。 无法使用 ConditionalSelect(mask, LoadVectorNonFaulting(addr), zero) 到掩码负载的标准转换,因为它无法正确处理 FFR 寄存器状态。 因此,实现屏蔽的非故障加载的唯一有效方法是将其公开为专用 API。
建议的措施
- 对于现有用途
Sve.ConditionalSelect(mask, Sve.LoadVector*NonFaulting*(addr), zero),请将其替换为Sve.LoadVector*NonFaulting*(mask, addr)。 - 更新无故障加载的其他用法以包括真正的掩码:
Sve.LoadVector*NonFaulting*(Sve.CreateTrueMask*(), addr)。
受影响的 API
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorNonFaulting
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToInt16(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToInt32(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToInt64(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToUInt16(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToUInt32(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorByteNonFaultingZeroExtendToUInt64(Byte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt16NonFaultingSignExtendToInt32(Int16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt16NonFaultingSignExtendToInt64(Int16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt16NonFaultingSignExtendToUInt32(Int16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt16NonFaultingSignExtendToUInt64(Int16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt32NonFaultingSignExtendToInt64(Int32*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorInt32NonFaultingSignExtendToUInt64(Int32*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToInt16(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToInt32(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToInt64(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToUInt16(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToUInt32(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorSByteNonFaultingSignExtendToUInt64(SByte*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt16NonFaultingZeroExtendToInt32(UInt16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt16NonFaultingZeroExtendToInt64(UInt16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt16NonFaultingZeroExtendToUInt32(UInt16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt16NonFaultingZeroExtendToUInt64(UInt16*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt32NonFaultingZeroExtendToInt64(UInt32*)
- System.Runtime.Intrinsics.Arm.Sve.LoadVectorUInt32NonFaultingZeroExtendToUInt64(UInt32*)