2012-05-25 18 views
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 

Respuesta

10

Que borra los 32 bits superiores. Cuando escribe en un registro de 32 bits en x86-64, los 32 bits superiores se borran automáticamente. Como esi contiene un parámetro de 32 bits, los 32 bits superiores podrían contener cualquier valor, por lo que deben borrarse antes de poder usar rsi.

+0

pero la instrucción inmediatamente anterior escribe en esi – wowest

+1

@wowest No, esto no es sintaxis intel. El operando de destino es el segundo. –

+0

@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? –

Cuestiones relacionadas