说我有一段代码

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/

10-15 10:25