I metodi SSE e SSE2 CompareGreaterThan gestiscono correttamente gli input non un numero

I metodi System.Runtime.Intrinsics.X86.Sse e System.Runtime.Intrinsics.X86.Sse2 seguenti sono stati corretti per gestire correttamente gli input NaN e abbinare il comportamento hardware dei metodi equivalenti nella classe System.Runtime.Intrinsics.X86.Avx:

  • CompareGreaterThan
  • CompareGreaterThanOrEqual
  • CompareNotGreaterThan
  • CompareNotGreaterThanOrEqual
  • CompareScalarGreaterThan
  • CompareScalarGreaterThanOrEqual
  • CompareScalarNotGreaterThan
  • CompareScalarNotGreaterThanOrEqual

Descrizione delle modifiche

In precedenza, gli input NaN per i metodi Sse e Sse2 elencati restituivano un risultato non corretto. Il risultato differiva 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 architetture standard del settore SSE (Streaming SIMD Extensions) e SSE2 (Streaming SIMD Extensions 2) non forniscono supporto hardware diretto per questi metodi di confronto, quindi vengono implementati nel software. In precedenza, i metodi non erano implementati nel modo appropriato e non gestivano gli input NaN correttamente. Per il codice trasferito da un'implementazione nativa, il comportamento non corretto può introdurre bug. Per un percorso del codice a 256 bit, i metodi possono anche generare risultati diversi per i metodi equivalenti nella classe Avx.

Come esempio dei metodi precedentemente errati, è possibile implementare CompareNotGreaterThan(x,y) come CompareLessThanOrEqual(x,y) per gli interi normali. Tuttavia, per gli input NaN, tale logica calcola il risultato errato. L'uso di CompareNotLessThan(y,x) confronta invece correttamente i numeri e tiene conto degli input NaN.

Versione introdotta

5.0

  • Se il comportamento precedente era un bug, non è necessaria alcuna modifica.

  • Se il comportamento precedente era 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