我一直在看x64软件开发人员手册,它看起来像内置的{MIN | MAX} {S | P} {S | D}指令未实现该函数中的minNum和maxNum尽管英特尔在同一文档中声称其CPU完全兼容,但仍为IEEE 754标准。

如果一个操作数是QNaN而不是SNaN,则Intel运算总是返回第二个操作数,而minNum和maxNum返回另一个操作数,即:

IEE 754:
minNum(1.0, QNaN) -> 1.0
minNum(QNaN, 1.0) -> 1.0

Intel x64:
MIN(1.0, QNaN) -> QNaN
MIN(QNaN, 1.0) -> 1.0


我是否正确,必须对标准兼容的minNum / maxNum函数进行额外的第一个操作数校验,并且不能直接将其转换为相应的指令?

最佳答案

是的,您将需要其他说明。

Arch Robinson在this comment on a Julia issue thread中对此进行了讨论:


minsd的语义是在90年代设计的,早于IEEE 754-2008,因此编译器可以优化通用的C习惯用法x<y?x:y


该问题继续提出了一系列AVX指令以使其变为NaN中毒。相反,如果您想要IEEE行为,则可以使用

VMIN R, a, b           // result is b if a or b are NaN, min(a,b) otherwise
                       // so Nan is not propagated only if a is the NaN
VCMPNEQ M, b, b        // M=11…11  if b is NaN, 0 otherwise
VBLENDV Res, R, a, M   // Res = R if M=0 (b not NaN), otherwise Res=a (if b is NaN)

08-07 14:39