SSE- och SSE2 CompareGreaterThan-metoder hanterar NaN-indata korrekt
Följande System.Runtime.Intrinsics.X86.Sse- och System.Runtime.Intrinsics.X86.Sse2-metoder har åtgärdats för att hantera NaN
indata korrekt och matcha maskinvarubeteendet för motsvarande metoder i klassen System.Runtime.Intrinsics.X86.Avx:
CompareGreaterThan
CompareGreaterThanOrEqual
CompareNotGreaterThan
CompareNotGreaterThanOrEqual
CompareScalarGreaterThan
CompareScalarGreaterThanOrEqual
CompareScalarNotGreaterThan
CompareScalarNotGreaterThanOrEqual
Ändra beskrivning
Tidigare returnerade NaN
indata till de angivna Sse- och Sse2 metoderna ett felaktigt resultat. Resultatet skilde sig också från resultatet som genererades av motsvarande metod i klassen Avx.
Från och med .NET 5 hanterar dessa metoder korrekt NaN
indata och returnerar samma resultat som motsvarande metoder i klassen Avx.
SSE (Streaming SIMD Extensions) och Streaming SIMD Extensions 2 (SSE2) Instruction Set Architectures (ISA) ger inte direkt maskinvarustöd för dessa jämförelsemetoder, så de implementeras i programvara. Tidigare implementerades metoderna felaktigt och de hanterade felaktigt NaN
indata. För kod som portats från ursprungliga, kan ett felaktigt beteende introducera buggar. För en 256-bitars kodsökväg kan metoderna också ge olika resultat än motsvarande metoder i klassen Avx.
Som ett exempel på hur metoderna tidigare var felaktiga kan du implementera CompareNotGreaterThan(x,y)
som CompareLessThanOrEqual(x,y)
för vanliga heltal. Men för NaN
indata beräknar logiken fel resultat. I stället, med CompareNotLessThan(y,x)
jämförs talen korrekt, och både och tar hänsyn till NaN
indata.
Version introducerad
5.0
Rekommenderad åtgärd
Om det tidigare beteendet var en bugg krävs ingen ändring.
Om det tidigare beteendet önskades kan du underhålla det beteendet genom att ändra det relevanta anropet på följande sätt:
-
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)
-
Berörda API:er
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>)