【发布时间】:2012-09-17 13:06:53
【问题描述】:
考虑以下代码:
int isqrt(int x) {
unsigned int r;
r = x >> 7;
r += x / r;
r >>= 1;
r += x / r;
r >>= 1;
r += x / r;
r >>= 1;
return r;
}
gcc -O3 isqrt.c -S 生成这个:
_isqrt:
pushl %ebx
movl 8(%esp), %ecx
movl %ecx, %ebx
sarl $7, %ebx
movl %ecx, %eax
xorl %edx, %edx ; huh?
divl %ebx
addl %eax, %ebx
shrl %ebx
movl %ecx, %eax
xorl %edx, %edx ; huh?
divl %ebx
addl %eax, %ebx
shrl %ebx
movl %ecx, %eax
xorl %edx, %edx ; huh?
divl %ebx
addl %ebx, %eax
shrl %eax
popl %ebx
ret
为什么会无缘无故清除%edx 3 次?
【问题讨论】:
-
因为你不应该使用
-O3,也许吧? ;-) -
因为
divl有%edx作为输入和输出。 -
@harold:
%edx究竟是如何用作输入的? -
@harold:没关系,找到了 - 它需要一个双字。将其发布为答案,我会接受。
标签: optimization gcc assembly