Um zu verhindern, dass GCC bei jedem Aufruf von |=
oder &=
eine load-modify-store-Operation erzeugt, habe ich die folgenden Makros definiert:
Und sie arbeiten großartig; Die zerlegte Binärdatei ist perfekt.
Das Problem tritt auf, wenn ich mehrere nacheinander benutze:
%Vor%Dies führt zu:
%Vor%Gibt es eine Möglichkeit, GCC (3.3.6-m68hc1x-20060122) automatisch die redundanten Stack-Operationen zu optimieren?
gcc wird immer die Assembly-Anweisungen ausgeben, die Sie ihm mitteilen. Anstatt also Code explizit zu schreiben, um Register mit dem Wert zu laden, den Sie bearbeiten möchten, sollten Sie gcc stattdessen anweisen, dies in Ihrem Namen zu tun. Sie können dies mit Registereinschränkungen tun.
Leider scheint der 6811-Code-Generator kein Standard-Teil von gcc zu sein --- Ich finde die Dokumentation im Handbuch nicht. Daher kann ich Sie nicht auf plattformspezifische Teile der Dokumentation verweisen. Aber das generische Bit, das Sie lesen müssen, finden Sie hier: Ссылка
Die Syntax ist ausgeflippt, aber die Zusammenfassung ist:
%Vor% ... wobei inputs
und outputs
Listen von Beschränkungen sind, die gcc mitteilen, welchen Wert wo zu setzen ist. Das klassische Beispiel ist:
f
gibt an, dass der benannte Wert in ein Gleitkommaregister gehen muss; =
gibt an, dass es sich um eine Ausgabe handelt. dann werden die Namen der Register in die Anweisung eingefügt.
Sie werden wahrscheinlich so etwas wollen:
%Vor% ... wobei i
eine Variable ist, die den Wert enthält, den Sie ändern möchten. Z
müssen Sie in den 6811 gcc docs suchen --- es ist eine Einschränkung, die ein Register darstellt, das für die asm-Anweisung gültig ist, die erzeugt wird. % Co_de% gibt an, dass die Eingabe ein Register mit Ausgabe 0 teilt und für Lese- / Schreibwerte verwendet wird.
Weil Sie gcc mitgeteilt haben, welches Register Sie 0
haben möchten, kann es dieses Wissen in seinen Register-Allokator integrieren und den kostengünstigsten Weg finden, i
dort zu finden, wo Sie es mit der geringsten Menge an Code benötigen . (Manchmal kein zusätzlicher Code.)
gcc Inline Assembly ist zutiefst verzerrt und seltsam, aber ziemlich mächtig. Es lohnt sich, etwas Zeit zu investieren, um das Constraint-System gründlich zu verstehen, um es optimal zu nutzen.
(Übrigens, ich kenne den 6811-Code nicht, aber haben Sie vergessen, das Ergebnis der Operation irgendwo zu platzieren? Ich würde erwarten, dass i
der stx
entspricht.)
Update: Oh, ich sehe, was ldx
jetzt macht --- es schreibt das Ergebnis zurück in einen Speicherort, richtig? Das ist immer noch machbar, aber es ist ein bisschen schmerzhafter. Sie müssen gcc mitteilen, dass Sie diesen Speicherort ändern, sodass er sich nicht auf einen zwischengespeicherten Wert verlassen kann. Sie müssen einen Ausgabeparameter mit der Einschränkung bset
haben, der diesen Speicherort darstellt. Überprüfen Sie die Dokumentation.