次のコードを検討してください。
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回も理由もなくクリアするのですか?