8
Por esta pieza de código C:¿Por qué gcc movl al mismo registro?
uint64_t roundUp(uint64_t value, uint32_t blockSize)
{
return (value + blockSize - 1) & ~(blockSize - 1);
}
gcc 4.6 -O3 genera el siguiente montaje:
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
Podría alguien decirme por qué iba a querer hacer esto?
movl %esi, %esi
pero la instrucción inmediatamente anterior escribe en esi – wowest
@wowest No, esto no es sintaxis intel. El operando de destino es el segundo. –
@ughoavgfhw eso es esclarecedor, gracias. ¿Te importaría explicar cómo (blockSize - 1) termina en% edx? Puedo ver cómo BlockSize termina allí, pero blockSize - 1? –