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

时间:2012-09-17 13:06:54

标签: optimization gcc assembly

请考虑以下代码:

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次?

1 个答案:

答案 0 :(得分:6)

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