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在我的代码中正常工作之后.
我怎么做这个比较?
英特尔的手册文档如何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),并且更快.(有关更多链接,请参阅x86标记wiki).
x87仅对80位扩展精度有用,因为通常可以安全地假设SSE2可用,即使在32位模式下也是如此.