Assembly 有效三值比较

Assembly 有效三值比较,assembly,optimization,x86,Assembly,Optimization,X86,对于无符号整数,获取 if (a>b) => 1 if (a=b) => 0 if (a<b) => -1 有没有一种方法可以在不使用少于5条指令或更少字节的分支的情况下执行此操作?Clang 3.7为我生成以下x86-64机器代码: 0: 48 39 f7 cmp rcx,rdx 3: 0f 97 c0 seta al 6: 0f b6 c0 movz

对于无符号整数,获取

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

有没有一种方法可以在不使用少于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

这里的理由是什么?您是否担心指令缓存压力?一旦您分析了所有各种建议,您可以发布一些计时结果吗?像这样,因为它不会更改字节寄存器。部分寄存器写入会导致管道暂停。很难选择正确的答案。因为它的简单性和不使用字节寄存器,所以选择了这个。甚至还有进一步改进的余地,因此获得了该奖项。
483bca          cmp     rcx,rdx
1bc0            sbb     eax,eax
483bd1          cmp     rdx,rcx
83d000          adc     eax,0
...
11d8            adc     eax,ebx