Compiler-Optimierungen entschlüsseln

Hallo,

ich bin gerade folgender Compiler-Optimierung begegnet:
Code:
[...]
mov    ecx,0xaaaaaaab
mov    edi,ebx  <-- ebx ist eine Zahl zwischen 0 und 31
mov    eax,edi
imul   ecx
add    edi,edx

mov    eax,edi
shr    eax,0x1f
sar    edi,1
add    edi,eax
[...]

Was hier passiert ist eine Signed Multiplication des Parameters ebx durch die (negative) Zahl 0xaaaaaaab. Das Ergebnis wird in edx:eax geschrieben. Der Teil aus edx wird dann zum Parameter addiert (oder eher subtrahiert, edx ist negativ).
Das ist mir so weit klar, aber welcher C-Code wird in diesen Assembler-Code übersetzt?
Eine Google-Suche hat mir verraten, dass eine Unsigned Multiplication mit 0xaaaaaaab einer Division durch Drei entspricht. Vielleicht hilft das weiter...?
 
Zuletzt bearbeitet:
Okay, ich habe es herausgefunden: Der erste Block entspricht dem ganzzahligen Teil einer Multiplikation mit 2/3. Interessant...
 
Zurück
Oben