为什么海湾合作委员会需要出于神秘的原因清除edx?

orl*_*rlp 3 optimization assembly gcc

请考虑以下代码:

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;
}
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

为什么明确%edx无缘无故3次?

har*_*old 6

divl x%edx:%eax通过x,所以%edx应是一种有意义的(通常为零).它还将余数放入其中,%edx因此必须再次清除,而不是仅仅清除一次.