高效三值比较

Efficient three valued compare

对于无符号整数得到

的结果
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,-    
D3E8             shr eax,cl

13 bytes in total

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

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 个字节。

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

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

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

...
11d8            adc     eax,ebx