Warum integriert der Delphi-Compiler keine Assemblyfunktionen?
Frage
Manchmal schreibe ich sehr kurze Assemblerfunktionen wie
function SeniorBit(Value: LongWord): Integer;
asm
OR EAX,EAX
JZ @@Done
BSR EAX,EAX
INC EAX
@@Done:
end;
Das scheinen die besten Kandidaten für Inlining zu sein:
function SeniorBit(Value: LongWord): Integer; inline;
aber der Delphi-Compiler erlaubt es nicht.Warum?
Aktualisiert:
Dank ldsandon gibt es einen offenen 5,5-Jährigen Bericht über QC.Der Bericht enthält einige Vorschläge (wie die Erweiterung der ASM-Direktive), um das ASM-Inlining für den Compiler zu vereinfachen.Ich würde es vorziehen, die „nackte“ Direktive auf der Prozedur-/Funktionsebene einzuführen, die dem Compiler sagt, dass er keinen Stapelrahmen für die Prozedur erstellen muss und optional, welche Register (unter eax, edx und ecx) beibehalten werden sollen.
Wenn die allgemeine Aufgabe effizienter Inlining-Prozeduren mit BASM-Code schwierig (und möglicherweise unnötig) ist, ist es eine gute Idee, Inlining für die wichtigsten Fälle zu aktivieren (z. B. nackte Funktionen mit explizit deklarierter Registerverwendung).
Lösung
Sehen Sie sich den Quality Central-Bericht Nr. 9283 an (und stimmen Sie dafür).Grundsätzlich besteht das Problem darin, dass der Compiler in der Lage sein sollte, zu verstehen, welche Register vor dem Inline-Code erhalten bleiben und welche danach wiederhergestellt werden sollen.Solange der Compiler das Register verwaltet, ist es einfach, wenn die Verwendung nicht unter seiner Kontrolle steht, ist dies nicht der Fall.Ihr Beispiel ist ziemlich einfach, aber der Compiler muss in der Lage sein, komplexere Fälle zu verarbeiten.Der Bericht befindet sich im geöffneten Zustand. Ich hoffe, dass der neue Compiler auch BASM-Code integrieren kann.
Andere Tipps
Sie können keinen handgefertigten Assemblercode integrieren.
Es wäre sehr schwierig, das Inlining dieser Assembler-Teile zuzulassen;Beim normalen Inlining gibt es alle möglichen Auswirkungen auf die Registernutzung, lokale Variablen usw., die der Compiler mit der Inline-Assembly nicht erreichen kann.