Зачем gcc movl в тот же регистр?

Для этого фрагмента кода 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
8
задан Inso Reiges 25 May 2012 в 08:39
поделиться