对于这段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
答案 0 :(得分:10)
清除高32位。当您在x86-64中写入32位寄存器时,高32位会自动清零。由于esi
包含32位参数,因此高32位可以包含任何值,因此需要先清除它们才能使用rsi
。