8
Für dieses Stück C-Code:Warum würde gcc in dasselbe Register wechseln?
uint64_t roundUp(uint64_t value, uint32_t blockSize)
{
return (value + blockSize - 1) & ~(blockSize - 1);
}
gcc 4.6 O3 die folgende Montage erzeugt:
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
Könnte mir jemand sagen, warum es dies tun wollen?
movl %esi, %esi
aber die Anweisung direkt oben schreibt esi – wowest
@wowest Nein, das ist nicht Intel-Syntax. Der Zieloperand ist der zweite. –
@ughoavgfhw das ist aufschlussreich, danke. Möchten Sie auch erklären, wie (BlockSize - 1) in% edx endet? Ich kann sehen, wie blockSize dort endet, aber blockSize - 1? –