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).

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top