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 位会自动清除。由于esi包含一个 32 位的参数,高 32 位可以包含任何值,所以需要清除它们rsi才能使用。

于 2012-05-25T03:51:51.013 回答