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

时间:2012-05-25 03:42:50

标签: assembly

对于这段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

1 个答案:

答案 0 :(得分:10)

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