Frage

Ich möchte einige Architekturänderungen in einer bereits vorhandenen Architektur (x86) unter Verwendung von Simulatoren testen. Um sie jedoch ordnungsgemäß zu testen und Benchmarks auszuführen, muss ich möglicherweise einige Änderungen am Befehlssatz vornehmen. Gibt es eine Möglichkeit, diese Änderungen zu GCC oder einem anderen Compiler hinzuzufügen?

War es hilfreich?

Lösung

Einfache Lösung:

Ein allgemeiner Ansatz besteht darin, Inline -Montage hinzuzufügen und die Anweisungsbytes direkt zu codieren.

Zum Beispiel:

int main()
{
    asm __volatile__ (".byte 0x90\n");
    return 0;
}

kompiliert (gcc -o3) in:

00000000004005a0 <main>:
  4005a0:       90                      nop
  4005a1:       31 c0                   xor    %eax,%eax
  4005a3:       c3                      retq

Ersetzen Sie also einfach 0x90 durch Ihre Instytes. Natürlich werden Sie den tatsächlichen Anweisungen in einem regulären Objdumper nicht sehen, und das Programm würde wahrscheinlich nicht in Ihrem System ausgeführt werden (es sei denn, Sie verwenden eine der NOP -Kombinationen), aber der Simulator sollte sie erkennen, wenn er dort ordnungsgemäß implementiert ist.

Beachten Sie, dass Sie nicht erwarten können, dass der Compiler für Sie gut optimiert wird, wenn er diese Anweisung nicht kennt, und Sie sollten sich aufpassen und mit Inline -Assembly -Clobber-/Eingangs-/Ausgabemöglichkeiten arbeiten, wenn er den Status (Register, Speicher) zu ändert, an zu kündigen Gewährleistung der Richtigkeit. Verwenden Sie Optimierungen nur, wenn Sie müssen.


Komplizierte Lösung

Der alternative Ansatz besteht darin, dies in Ihrem Compiler zu implementieren - er kann in GCC durchgeführt werden, aber wie in den Kommentaren angegeben, ist LLVM wahrscheinlich eine der besten, mit Da LLVM am besten für IR-Optimierungsphasen geeignet ist und etwas weniger freundlich ist, wenn versucht wird, die Ziel-spezifischen Backends zu ändern.
Trotzdem ist es machbar und Sie müssen dies tun, wenn Sie auch planen, dass Ihr Compiler entscheidet, wann Sie diese Anweisung ausstellen sollen. Ich würde jedoch vorschlagen, die erste Option zu starten, um festzustellen, ob Ihr Simulator überhaupt mit dieser Ergänzung funktioniert und nur Zeit auf der Compiler -Seite verbringt.

Wenn Sie sich für die Implementierung in LLVM entscheiden, ist es am besten, sie als intrinsische Funktion zu definieren, es gibt hier relativ mehr Dokumentation dazu - http://llvm.org/docs/extendllvm.html

Andere Tipps

Sie können neue Anweisungen hinzufügen oder das Bestehen ändern, indem Sie die Gruppe von Dateien in GCC ändern, die als "Maschinenbeschreibung" bezeichnet werden. Anweisungsmuster in <target>.md Datei, ein Code in <target>.c Datei, Prädikate, Einschränkungen und so weiter. All dies liegt in $GCCHOME/gcc/config/<target>/ Mappe. All diese Dinge, die beim Schritt des Generation ASM -Code von RTL verwendet werden. Sie können auch Fälle von Anweisungen ändern, indem Sie einige andere allgemeine GCC -Quelldateien ändern, die SSA -Baumgenerierung, die RTL -Generation ändern, jedoch ein wenig kompliziert. Eine einfache Erklärung, was passiert ist:

https://www.cse.iitb.ac.in/grc/slides/cgotut-gcc/topic5-md-intro.pdf

Es ist machbar und ich habe es getan, aber es ist langweilig. Grundsätzlich ist es der Prozess, den Compiler auf eine neue Plattform zu portieren, indem sie eine vorhandene Plattform als Modell verwendet. Irgendwo in GCC gibt es eine Datei, die den Befehlssatz definiert, und sie durchläuft verschiedene Prozesse während der Kompilierung, die weitere Code und Daten generieren. Es ist mehr als 20 Jahre her, dass ich es getan habe, also habe ich alle Details vergessen, sorry.

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