8

この C コードの場合:

uint64_t roundUp(uint64_t value, uint32_t blockSize) 
{
    return (value + blockSize - 1) & ~(blockSize - 1);
}

gcc 4.6 -O3 により、次のアセンブリが生成されました。

roundUp(unsigned long, unsigned int):
.LFB0:
    .cfi_startproc
    movl    %esi, %edx
    movl    %esi, %esi
    leaq    -1(%rdi,%rsi), %rax
    negl    %edx
    andl    %edx, %eax
    ret
    .cfi_endproc

なぜこれをやりたいのか誰か教えてもらえますか?

movl    %esi, %esi
4

1 に答える 1

10

これにより、上位 32 ビットがクリアされます。x86-64 で 32 ビット レジスタに書き込むと、上位 32 ビットが自動的にクリアされます。には 32 ビットのパラメーターが含まれているためesi、上位 32 ビットには任意の値が含まれる可能性があるため、rsi使用する前にクリアする必要があります。

于 2012-05-25T03:51:51.013 に答える