无符号整数获取结果
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条指令或更少字节的分支的情况下执行此操作?
答案 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