奇怪的C ++循环展开优化

时间:2016-02-04 09:57:16

标签: visual-c++ assembly x86-64 compiler-optimization

我正在使用循环展开在C ++中实现template BigInt<size_t Chunks>(任何编译时固定宽度的整数)。

以下是bool operator <() const程序集的部分(VS 2010,/ O2),当操作数为BigIntChunks的数量较多时。

当我比较较低(普通)块时,代码完全符合预期:

mov         rax,qword ptr [rcx+18h]   //  get chunk of 'this'
mov         r8,qword ptr [rdx+18h]    //  get chunk of operand
cmp         rax,r8                    //  compare
jb          ADDRESS1                  //  jump below - "return true"
jne         ADDRESS2                  //  jump not equal - "return false"
...                                   //  next chunk

当我将较高的操作数块与'this'操作数的符号扩展名进行比较时,我希望看到非常相似的代码(第二个mov除外):

mov         r8,qword ptr [rdx+18h]    //  get chunk of operand
cmp         rax,r8                    //  compare
jb          ADDRESS1                  //  jump below - "return true"
jne         ADDRESS2                  //  jump not equal - "return false"
...                                   //  next chunk

但我得到了这个奇怪的,夸大的代码:

mov         rax,qword ptr [rdx+40h]   //  get chunk of operand
cmp         rax,r8                    //  compare
sete        r9b                       //  save ZF (???)
cmp         rax,r8                    //  compare (identical, again!!!)
jb          ADDRESS1                  //  jump below - "return true"
test        r9b,r9b                   //  test saved ZF
je          ADDRESS2                  //  jump equal (ZF==0) - "return false"
...                                   //  next chunk

有没有人有想法,这里发生了什么?

我会根据请求添加原始代码,但我认为优化后不应该保留这样的代码。

0 个答案:

没有答案