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