Для этого фрагмента кода 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