Die Vorteile der Verwendung von 32-Bit-Registern / -Anweisungen in x86-64
Manchmal verwendet gcc ein 32-Bit-Register, wenn ich davon ausgehen würde, dass es ein 64-Bit-Register verwendet. Zum Beispiel der folgende C-Code:
unsigned long long
div(unsigned long long a, unsigned long long b){
return a/b;
}
wird mit der Option -O2 kompiliert, um (ohne Boilerplate):
div:
movq %rdi, %rax
xorl %edx, %edx
divq %rsi
ret
Für die vorzeichenlose Division ist das Register%rdx
muss sein0
. Dies kann erreicht werden mitxorq %rdx, %rdx
, aberxorl %edx, %edx
scheint den gleichen Effekt zu haben.
Zumindest auf meinem Computer gab es keine Leistungssteigerung (d. H. Beschleunigung) fürxorl
Überxorq
.
Ich habe eigentlich mehr als nur eine Frage:
Warum bevorzugt gcc die 32-Bit-Version?Warum hört gcc bei @ axorl
und benutzt keinxorw
? Gibt es Maschinen für diexorl
ist schneller alsxorq
? Sollte man 32-Bit-Register / -Operationen immer vorziehen, wenn dies möglich ist, anstatt 64-Bit-Register / -Operationen?