说我有一段代码
double test(double value, double denom) {
return (denom == 0 ? 0 : value/denom);
}
汇编为:
movapd %xmm0, %xmm2
xorpd %xmm0, %xmm0
ucomisd %xmm0, %xmm1
jnp .L8
.L5:
movapd %xmm2, %xmm0
divsd %xmm1, %xmm0
ret
.p2align 4,,10
.p2align 3
.L8:
jne .L5
rep
ret
是否有一些简洁的方法来消除分支?有问题的拱门是X86-64。 例如,PPC有选择指令,在X86-64 ISA中是否有等价的?
答案 0 :(得分:4)
假设您关闭了例外,屏蔽结果很简单:
xorpd %xmm2, %xmm2
cmpneqsd %xmm1, %xmm2
divsd %xmm1, %xmm0
andpd %xmm2, %xmm0
ret
答案 1 :(得分:1)
分支预测机制近来非常好。
除非你实际上 具有一些非零频率的零除数,否则分支预测器将会发现jnp在统计上不会分支并且只是在没有任何性能损失的情况下失效。
您是否已经对此进行了测量,并且看到了因遗漏测试而导致的任何性能损失?