英特尔x86_64程序集比较签名的双精度浮点数

for*_*teu 2 precision assembly sse x86-64 intel

我根据主题有问题.

在xmm0寄存器中,我有一个值,例如-512.000000
和xmm4 : 0.000000.

我尝试将第一个值与零进行比较,但我无法实现这一点.

comisd xmm0, xmm4
Run Code Online (Sandbox Code Playgroud)

COMISD指令以奇怪的方式设置标志,并且只有jnz在我的代码中正常工作之后.

我怎么做这个比较?

Pet*_*des 7

英特尔的手册文档如何COMISD设置标志.

首先,检查无序jp(如果您希望代码对NaN输入正常工作).

然后你可以使用任何ja/ jae/ jb/ jbe(上/下)条件或它们的负数(jna等),或je/ jne(等于/不等于).这些条件与无符号整数比较的条件相同.显然cmov和setcc也有效.

这些条件具有类似的同义词jc(如果CF == 1则跳转),但是上/下具有正确的语义含义,因此可以减少使代码具有人类可读性所需的注释量.

您可以跳过jp之前的条件ja,因为CF = 0意味着PF = 0.(a例如b,如果操作数是无序的,则条件将为假.对于无序操作数,某些其他条件也是如此,因此如果需要排除NaN输入be,jp则需要在之前或之后分支).


历史兴趣/为什么这样设计:

注意jb的标志,设置匹配您的x87得到什么jbe/ comisd/ fcom.有关使用该序列的示例,另请参阅此x87教程/指南.但仅限于历史兴趣! fnstsw ax,也以同样的方式设置标志,已经存在超过20年(P6),并且更快.(有关更多链接,请参阅标记wiki).

x87仅对80位扩展精度有用,因为通常可以安全地假设SSE2可用,即使在32位模式下也是如此.