如何以无分支方式根据状态寄存器状态清除32位寄存器?
无分支清除32位寄存器(基于状态寄存器)的方案探讨
首先给你明确结论:目前x86平台没有原生的低开销无分支指令,可以直接根据状态寄存器的状态清除32位寄存器。
咱们来聊聊你提到的几种替代方案的问题:
- 用额外清零寄存器配合
CMOVcc实现的思路是可行,但在x86 32位模式下开销实在太高——你得专门保留一个始终为0的寄存器,而且CMOVcc本身的执行周期也不算低,对于追求性能的场景来说不太划算。 - 更遗憾的是
CMOVcc没有立即数版本,要是能直接把0作为源操作数就省事多了;退一步说从内存里读0也不是好办法,内存访问的延迟比寄存器操作高太多,完全偏离了无分支优化想要减少延迟的初衷。 - 虽然x86有
SETcc指令可以根据状态设置1字节的目标,但压根没有对应的CLEARcc指令来直接清除32位寄存器,这确实是个设计上的小遗憾。
内容的提问来源于stack exchange,提问作者Tomilov Anatoliy
相关产品推荐
相关产品推荐

