高效的三值比较

时间:2015-06-14 11:06:46

标签: assembly optimization x86

无符号整数获取结果

if (a>b) => 1
if (a=b) => 0
if (a<b) => -1

可以优化为无分支版本

return ((a > b) - (a < b))

这可以写成x86程序集,如下所示:

4829D1           cmp rcx,rdx
0F94C1           setz cl    
19C0             sbb eax,eax    
83D8FF           sbb eax,-$01    
D3E8             shr eax,cl

13 bytes in total

有没有办法在没有少于5条指令或更少字节的分支的情况下执行此操作?

2 个答案:

答案 0 :(得分:4)

Clang 3.7为我生成以下x86-64机器代码:

0:   48 39 f7                cmp    rcx,rdx
3:   0f 97 c0                seta   al
6:   0f b6 c0                movzx  eax,al
9:   83 d8 00                sbb    eax,0x0

这是计算的四条指令;结果在eax

这可以改进:

0:   31 C0                   xor eax,eax
2:   48 39 D1                cmp rcx,rdx
5:   0F 97 C0                setnbe al
8:   83 D8 00                sbb eax,0x0

11个字节。

答案 1 :(得分:2)

具有较少字节(11字节)和少一条指令(4条指令)的解决方案可能更快:

483bca          cmp     rcx,rdx
1bc0            sbb     eax,eax
483bd1          cmp     rdx,rcx
83d000          adc     eax,0

如果您有一个已知为空的备用寄存器,则可以将其改进为10个字节。

...
11d8            adc     eax,ebx