SSE 和 SSE2 CompareGreaterThan 方法可妥善處理 NAN 輸入
下列 System.Runtime.Intrinsics.X86.Sse 和 System.Runtime.Intrinsics.X86.Sse2 方法已經過修正,可妥善處理 NaN
輸入並比對 System.Runtime.Intrinsics.X86.Avx 類別中對等方法的硬體行為:
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
變更描述
先前針對列出的 Sse 和 Sse2 方法的 NaN
輸入會傳回不正確的結果。 該結果也與 Avx 類別中對應方法產生的結果不同。
從 .NET 5 開始,這些方法都能正確處理 NaN
輸入,並傳回與 Avx 類別中的對應方法相同的結果。
Streaming SIMD Extensions (SSE) 和 Streaming SIMD Extensions 2 (SSE2) 產業標準結構 (ISA) 不為這些比較方法提供直接硬體支援,因此這些方法實作於軟體中。 先前這些方法並未妥善實作,因此以不正確的方式處理了 NaN
輸入。 針對原生移植的程式碼,不正確的行為會導致錯誤。 針對 256 位元程式碼路徑,這些方法也會產生與 Avx 類別中對等方法不同的結果。
若想了解這些方法先前不正確的方式,您可將 CompareNotGreaterThan(x,y)
實作為 CompareLessThanOrEqual(x,y)
做為一般整數。 不過,針對 NaN
輸入,這項邏輯會計算錯誤的結果。 反之,請用 CompareNotLessThan(y,x)
正確比較數字,同時將 NaN
列入考量。
導入的版本
5.0
建議的動作
如果先前的行為產生錯誤,則無須進行變更。
如果先前的行為合宜,則可變更相關叫用來維持該行為,如下所示:
CompareGreaterThan(x,y)
->CompareNotLessThanOrEqual(x,y)
CompareGreaterThanOrEqual(x,y)
->CompareNotLessThan(x,y)
CompareNotGreaterThan(x,y)
->CompareLessThanOrEqual(x,y)
CompareNotGreaterThanOrEqual(x,y)
->CompareLessThan(x,y)
CompareScalarGreaterThan(x,y)
->CompareScalarNotLessThanOrEqual(x,y)
CompareScalarGreaterThanOrEqual(x,y)
->CompareScalarNotLessThan(x,y)
CompareScalarNotGreaterThan(x,y)
->CompareScalarLessThanOrEqual(x,y)
CompareScalarNotGreaterThanOrEqual(x,y)
->CompareScalarLessThan(x,y)
受影響的 API
System.Runtime.Intrinsics.X86.Sse.CompareGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareGreaterThanOrEqual(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareNotGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareNotGreaterThanOrEqual(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareScalarGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse.CompareScalarNotGreaterThan(Vector128<Single>, Vector128<Single>)
System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareGreaterThanOrEqual(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareNotGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareScalarGreaterThan(Vector128<Double>, Vector128<Double>)
System.Runtime.Intrinsics.X86.Sse2.CompareScalarNotGreaterThan(Vector128<Double>, Vector128<Double>)