SSE および SSE2 の CompareGreaterThan メソッドで NaN 入力が正しく処理される

次の System.Runtime.Intrinsics.X86.Sse メソッドと System.Runtime.Intrinsics.X86.Sse2 メソッドが修正され、NaN 入力を適切に処理するようになり、System.Runtime.Intrinsics.X86.Avx クラスで同等のメソッドのハードウェア動作に一致するようになりました。

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

変更の説明

以前は、一覧にある Sse メソッドと Sse2 メソッドに NaN を入力すると、間違った結果が返されました。 また、この結果は、Avx クラスでこれに相当するメソッドで生成される結果とは違っていました。

.NET 5 より、これらのメソッドで NaN 入力が正しく処理され、Avx クラスでこれに相当するメソッドと同じ結果が返されるようになりました。

Streaming SIMD Extensions (SSE) および Streaming SIMD Extensions 2 (SSE2) の業界標準アーキテクチャ (ISA) には、これらの比較メソッドの直接的なハードウェア サポートがありません。そのため、ソフトウェアで実装されます。 以前は、メソッドは不適切に実装され、NaN 入力が間違って処理されていました。 ネイティブから移植されたコードについては、間違った動作からバグが発生することがあります。 256 ビット コード パスの場合、これらのメソッドから、Avx クラスでの同等のメソッドとは異なる結果が生成されることもあります。

通常の整数に対して CompareLessThanOrEqual(x,y) として CompareNotGreaterThan(x,y) を実装できるのは、以前、メソッドがいかに間違っていたか示す例です。 しかしながら、NaN 入力の場合、そのロジックでは間違った結果が計算されます。 代わりに、CompareNotLessThan(y,x) を使用すると数値が正しく比較され、"かつ"、NaN 入力が考慮されます。

導入されたバージョン

5.0

  • 以前の動作がバグだった場合、変更は必要ありません。

  • 以前の動作が望まれたものであれば、関連呼び出しを次のように変更し、この動作を維持できます。

    • 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