无分支避免被零除

时间:2014-11-13 16:19:45

标签: optimization assembly

说我有一段代码

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中是否有等价的?

2 个答案:

答案 0 :(得分:4)

假设您关闭了例外,屏蔽结果很简单:

xorpd %xmm2, %xmm2
cmpneqsd %xmm1, %xmm2
divsd %xmm1, %xmm0
andpd %xmm2, %xmm0
ret

答案 1 :(得分:1)

分支预测机制近来非常好。

除非你实际上 具有一些非零频率的零除数,否则分支预测器将会发现jnp在统计上不会分支并且只是在没有任何性能损失的情况下失效。

您是否已经对此进行了测量,并且看到了因遗漏测试而导致的任何性能损失?