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

Antwort

10

Das löscht die oberen 32 Bits. Beim Schreiben in ein 32-Bit-Register in x86-64 werden die oberen 32 Bits automatisch gelöscht. Da esi einen 32-Bit-Parameter enthält, können die oberen 32 Bits einen beliebigen Wert enthalten. Daher müssen sie gelöscht werden, bevor rsi verwendet werden kann.

+0

aber die Anweisung direkt oben schreibt esi – wowest

+1

@wowest Nein, das ist nicht Intel-Syntax. Der Zieloperand ist der zweite. –

+0

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

Verwandte Themen