请考虑以下代码:
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次?
答案 0 :(得分:6)
divl x
将%edx:%eax
除以x
,因此%edx
应该是有意义的(通常为零)。它还将余数放在%edx
中,因此必须再次清除它,而不仅仅是一次。