是否有没有分支的方法来清除32位寄存器,具体取决于状态寄存器状态?它可以使用其他清除寄存器和CMOVcc
来实现,但是在32位模式下,它在 x86 上太昂贵了。可悲的是,CMOVcc
没有任何版本的操作数。从内存读取也很糟糕。
有 SETcc
(尽管操作数为1个字节(,但不是 x86 。
CLEARcc
"指令这可能会让您失望,但是CMOVcc
在这方面非常好。将其与可变ddZERO
一起使用值0
并不糟糕,尤其是在循环中。
CMOVcc rTarget, ddZERO
如果满足cc
条件,将rTarget
寄存器重置为零。
否则(否则(您可以在不匹配的情况下倒转场景和CMOVcc
。哪种选择将更好地取决于发生的频率。
如果您有带有值0
的寄存器,则应使用它。但是,如果您无法使用(缓存(内存位置的寄存器不错。该估计基于经验,而在L1缓存内存位置中使用常数的IIRC实际上在循环中可以忽略不计。
在大多数ISA中基本上有一种通用方法提供分支机构设置或清除寄存器:生成全零或所有掩模从携带标志中:sbb reg,reg
在随身携带时清除掩码,当携带为零并设置设置设置时面膜。其次是and dst, reg
将清除目的地寄存器,或者将其保持不变。
一个人可以通过切换口罩或反转随身携带标志来反转条件。可以通过从测试的寄存器中减去一个或从零测试的寄存器中减去零的测试。第一组携带IFF寄存器为零;第二个表格集携带IFF寄存器为非零。