说我有一段代码
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 中是否有等效指令?
最佳答案
假设您关闭了异常,屏蔽结果很简单:
xorpd %xmm2, %xmm2
cmpneqsd %xmm1, %xmm2
divsd %xmm1, %xmm0
andpd %xmm2, %xmm0
ret
关于optimization - 无分支避免被零除,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26913505/