Dela via


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

  • 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