3

次のコードを検討してください。

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

なぜ%edx3回も理由もなくクリアするのですか?

4

1 に答える 1

6

divl xで割るので、%edx:%eax意味のあるものにする必要があります(多くの場合ゼロ)。また、残りを入れるので、一度だけではなく、もう一度クリアする必要があります。x%edx%edx

于 2012-09-17T13:16:16.580 に答える