是否有无分支方式根据状态寄存器状态清除32位寄存器?它可以使用额外的清除寄存器和CMOVcc
来实现,但对于我来说,在32位模式的 x86 上它太贵了。可悲的是CMOVcc
没有带有移植操作数的版本。从记忆中读取也是不好的变种。
x86 上有SETcc
(但操作数是1个字节)但不是“CLEARcc
”指令。
答案 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寄存器非零。