SSE 和 SSE2 CompareGreaterThan 方法正确处理 NaN 输入

修复了以下 System.Runtime.Intrinsics.X86.SseSystem.Runtime.Intrinsics.X86.Sse2 方法,以正确处理 NaN 输入,并匹配 System.Runtime.Intrinsics.X86.Avx 类中等效方法的硬件行为:

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

更改描述

以前,对列出的 NaNSse 方法的 Sse2 输入会返回不正确的结果。 结果也不同于 Avx 类中相应方法生成的结果。

从 .NET 5 开始,这些方法正确处理 NaN 输入,并返回与 Avx 类中相应方法相同的结果。

流式处理 SIMD 扩展 (SSE) 和流式处理 SIMD 扩展 2 (SSE2) 指令集体系结构 (ISA) 不提供对这些比较方法的直接硬件支持,因此它们在软件中实现。 以前,方法未正确实现,并且错误地处理了 NaN 输入。 对于从本地环境移植的代码,不正确的行为可能会引入错误。 对于 256 位代码路径,方法还可以生成与 Avx 类中的等效方法不同的结果。

有关说明这些方法以前是如何不正确的示例,可以为常规整数将 CompareNotGreaterThan(x,y) 实现为 CompareLessThanOrEqual(x,y)。 但是,对于 NaN 输入,逻辑会计算错误的结果。 相反,使用 CompareNotLessThan(y,x) 可以正确地比较数字,并考虑 NaN 输入。

引入的版本

5.0

  • 如果以前的行为是 bug,则无需更改。

  • 如果需要以前的行为,则可以通过更改相关调用来维护此行为,如下所示:

    • 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