无分支方式有条件地清除寄存器

时间:2018-02-10 17:49:19

标签: assembly x86 flags branch-prediction status-register

是否有无分支方式根据状态寄存器状态清除32位寄存器?它可以使用额外的清除寄存器和CMOVcc来实现,但对于我来说,在32位模式的 x86 上它太贵了。可悲的是CMOVcc没有带有移植操作数的版本。从记忆中读取也是不好的变种。

x86 上有SETcc(但操作数是1个字节)但不是“CLEARcc”指令。

2 个答案:

答案 0 :(得分:4)

这可能令你失望,但CMOVcc在这方面非常好。将它与值为0的变量CMOVcc rTarget, ddZERO 一起使用并不是那么糟糕,尤其是在循环中。

rTarget
如果满足cc条件,

CMOVcc寄存器重置为零 否则(否则)您可以在非匹配条件下反转方案和0。哪种选择会更好取决于发生的频率。

如果您的注册号为sometext, sometext2 moretext, moretext1, moretext2 *header* actual data --- --------------- ,则应使用该值。但是,如果你不能使用(缓存)内存位置备用寄存器也不是那么糟糕。此估算基于经验,IIRC在L1缓存内存位置使用常量,在循环中的延迟几乎可以忽略不计。

答案 1 :(得分:3)

在大多数ISA中基本上有一种通用方法提供分支设置或清除寄存器:从进位标志生成全0或全1掩码:sbb reg,reg在进位为零时清除掩码并在进位时设置掩码已设定。随后and dst, reg将清除目标寄存器,或保持不变。

可以通过切换掩码或反转进位标志来反转条件。零测试可以通过从被测寄存器中减去一个,或者从零减去被测寄存器来实现。第一组进位iff寄存器为零;第二种形式设置进位iff寄存器非零。