高效三值比较
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
对于无符号整数得到
的结果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