I metodi SSE e SSE2 CompareGreaterThan gestiscono correttamente gli input NaN
I metodi System.Runtime.Intrinsics.X86.Sse e System.Runtime.Intrinsics.X86.Sse2 seguenti sono stati corretti per gestire correttamente gli input NaN
e corrispondere al comportamento hardware dei metodi equivalenti nella classe System.Runtime.Intrinsics.X86.Avx:
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
Modificare la descrizione
In precedenza, NaN
input per i metodi elencati Sse e Sse2 restituivano un risultato non corretto. Il risultato differisce anche dal risultato generato dal metodo corrispondente nella classe Avx.
A partire da .NET 5, questi metodi gestiscono correttamente gli input NaN
e restituiscono gli stessi risultati dei metodi corrispondenti nella classe Avx.
Le Streaming SIMD Extensions (SSE) e le Streaming SIMD Extensions 2 (SSE2) Architetture del Set di Istruzioni (ISAs) non forniscono supporto hardware diretto per questi metodi di confronto, quindi vengono implementati tramite software. In precedenza, i metodi venivano implementati in modo errato e gestivano in maniera scorretta gli input NaN
. Per il codice convertito da nativo, il comportamento non corretto può introdurre bug. Per un percorso di codice a 256 bit, i metodi possono anche produrre risultati diversi per i metodi equivalenti nella classe Avx.
Come esempio di come i metodi erano precedentemente errati, è possibile implementare CompareNotGreaterThan(x,y)
come CompareLessThanOrEqual(x,y)
per i normali interi. Tuttavia, per gli input NaN
, tale logica calcola il risultato errato. Utilizzando CompareNotLessThan(y,x)
invece confronta correttamente i numeri e e prende in considerazione gli input NaN
.
Versione introdotta
5.0
Azione consigliata
Se il comportamento precedente era un bug, non è necessaria alcuna modifica.
Se il comportamento precedente è stato desiderato, è possibile mantenere tale comportamento modificando la chiamata pertinente come indicato di seguito:
-
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 interessate
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>)