Metody SSE a SSE2 CompareGreaterThan správně zpracovávají vstupy NaN
Následující System.Runtime.Intrinsics.X86.Sse metody a System.Runtime.Intrinsics.X86.Sse2 metody byly opraveny tak, aby správně zpracovávaly NaN
vstupy a odpovídaly hardwarovému chování ekvivalentních metod ve System.Runtime.Intrinsics.X86.Avx třídě:
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
Změna popisu
NaN
Dříve vstupy do uvedených Sse metod vrátily Sse2 nesprávný výsledek. Výsledek se také liší od výsledku vygenerovaného odpovídající metodou Avx ve třídě.
Počínaje rozhraním .NET 5 tyto metody správně zpracovávají NaN
vstupy a vrací stejné výsledky jako odpovídající metody ve Avx třídě.
Standardní architektury standardu SSE (Streaming SIMD Extensions) a Streaming SIMD Extensions 2 (SSE2) neposkytují přímou podporu hardwaru pro tyto metody porovnání, takže jsou implementované v softwaru. Dříve byly metody nesprávně implementovány a nesprávně zpracovávaly NaN
vstupy. Pro kód portovaný z nativního kódu může nesprávné chování představovat chyby. Pro 256bitovou cestu kódu mohou metody také vytvořit různé výsledky ekvivalentní metody ve Avx třídě.
Jako příklad, jak byly metody dříve nesprávné, můžete implementovat CompareNotGreaterThan(x,y)
jako CompareLessThanOrEqual(x,y)
pro běžná celá čísla. Pro NaN
vstupy ale tato logika vypočítá nesprávný výsledek. Místo toho použijete CompareNotLessThan(y,x)
správné porovnání čísel a bere NaN
v úvahu vstupy.
Zavedená verze
5,0
Doporučená akce
Pokud došlo k chybě předchozího chování, nevyžaduje se žádná změna.
Pokud bylo předchozí chování žádoucí, můžete toto chování zachovat tak, že změníte příslušné vyvolání následujícím způsobem:
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)
Ovlivněná rozhraní 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>)