Ale*_*xey 5 floating-point assembly x86-64 ieee-754
我一直在看x64软件开发人员手册,看起来内置的{MIN | MAX} {S | P} {S | D}指令没有实现名为minNum和maxNum的函数. IEEE 754标准,尽管英特尔在同一文档中声称其CPU完全兼容.
如果任一操作数是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
Run Code Online (Sandbox Code Playgroud)
我是否正确,必须通过额外检查第一个操作数来模拟符合标准的minNum/maxNum函数,并且不能直接转换为相应的指令?
是的,您将需要额外的说明。
\n\nArch Robinson在Julia 问题线程的评论中对此进行了讨论:
\n\n\n\n\nminsd 的语义是在 90 年代设计的,远早于 IEEE 754-2008,以便编译器可以优化常见的 C 习惯用法
\nx<y?x:y。
该问题继续建议使用一系列 AVX 指令来使其出现 NaN 中毒。如果您想要 IEEE 行为,那么您可以使用
\n\nVMIN R, a, b // result is b if a or b are NaN, min(a,b) otherwise\n // so Nan is not propagated only if a is the NaN\nVCMPNEQ M, b, b // M=11\xe2\x80\xa611 if b is NaN, 0 otherwise\nVBLENDV Res, R, a, M // Res = R if M=0 (b not NaN), otherwise Res=a (if b is NaN)\nRun Code Online (Sandbox Code Playgroud)\n