我正在使用循环展开在C ++中实现template BigInt<size_t Chunks>
(任何编译时固定宽度的整数)。
以下是bool operator <() const
程序集的部分(VS 2010,/ O2),当操作数为BigInt
且Chunks
的数量较多时。
当我比较较低(普通)块时,代码完全符合预期:
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
有没有人有想法,这里发生了什么?
我会根据请求添加原始代码,但我认为优化后不应该保留这样的代码。