为什么gcc movl到同一个寄存器?

Ins*_*ges 8 assembly

对于这段C代码:

uint64_t roundUp(uint64_t value, uint32_t blockSize) 
{
    return (value + blockSize - 1) & ~(blockSize - 1);
}
Run Code Online (Sandbox Code Playgroud)

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

谁能告诉我为什么要这样做?

movl    %esi, %esi
Run Code Online (Sandbox Code Playgroud)

ugh*_*fhw 10

清除高32位.当您在x86-64中写入32位寄存器时,高32位会自动清零.由于esi包含32位参数,高32位可以包含任何值,因此需要先清除它们rsi才能使用.