汇编中编写无分支代码时,是否应使用互补CMOV指令?
用CMOV实现
x = cond ? 1 : 2的最优写法对比 我们都知道可以通过CMOV指令编写无分支代码,现在要实现等价于x = cond ? 1 : 2的逻辑,有以下两种ASM写法可供选择:
写法1
CMOVE rax, 1 #1a CMOVNE rax, 2 #1b
写法2
MOV rax, 1 #2a CMOVNE rax, 2 #2b
性能分析
- 理论层面:写法1的两条CMOV指令不存在数据依赖,理论上可以近乎并行执行;而写法2中,
CMOVNE指令依赖于MOV指令写入的rax寄存器值,存在明确的数据依赖链,理论上执行效率会更低。 - 实际表现:实际运行中的性能差异并不明确,现代CPU的乱序执行、寄存器重命名等硬件优化会极大地隐藏这类数据依赖带来的延迟,具体哪个更快需要结合实际场景做性能测试才能确定。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

