2016-07-24 24 views
0

Ich möchte LLVM zwingen, -, TEST zu erzeugen - und ähnliche Anweisungen auf x86-64 nur bis zu 8 Bit Breite zu sein, zwingt z. 32bit-int Vergleiche in vier separate cmp + Verzweigungspaare. Dies erfordert offensichtlich eine Bitmaskierung und eine erhöhte Instruktionszählung. Kann ich dies erreichen, indem ich einfach bestimmte Anweisungen für x86-64 "deaktiviere", so dass LLVM automatisch den erforderlichen Klebstoffcode generiert? Muss ich selbst einen Pass schreiben und am IR arbeiten?Force reduzierte Breite der Vergleichsanweisungen

+0

Meine spekulative Vermutung wäre, dass Sie dies selbst tun müssten - warum sollte LLVM einen Modus haben, um absichtlich suboptimalen Maschinencode auszugeben? –

Antwort

0

Was Sie wahrscheinlich tun möchten, ist das Absenkmuster in den x86-.td-Dateien neu zu definieren. Es gibt Code, der aussieht wie "def Pat < ...>;" das definiert eine Übersetzung von einem Diagramm von Anweisungen zu einem anderen. Es sollte ein Muster für den Übergang von IR-Vergleichsbefehlen zu den x86-32-Bit-Vergleichsbefehlen geben. Sie sollten dieses Muster bearbeiten und stattdessen Ihre Sequenz von Vergleichen ausgeben.

+0

Was würde mich mit einem benutzerdefinierten llvm lassen - ist es möglich, dies als einen Pass zu implementieren? – user2722968

+0

Sie können die IR-Level-Vergleiche mit einem Pass ändern, aber das Backend ist immer noch frei, es zu erweitern, wenn es will, ich weiß nicht, wie es implementiert ist. Wenn Ihre Anforderung für bestimmte X86-Anweisungen erforderlich ist, können Sie dies nur mit Änderungen der Befehlsabsenkung sicherstellen. –

1

Nein, es gibt keine Möglichkeit, bestimmte Anweisungen wie diese von einem Vanilla-Build von LLVM zu deaktivieren. Alles, was Sie tun, um dies zu erreichen, erfordert eine Modifikation von LLVM.

Sie haben mehrere Möglichkeiten zur Modifizierung von LLVM:

  1. Sie können eine x86-spezifische Pass zum LLVM Backend hinzufügen (nicht auf dem IR funktioniert), die direkt auf die cmp und test Anweisungen expandiert in Anweisungsketten in Teilregistern. Sie müssten dies nach der Befehlsauswahl tun, um auszuschließen, dass ein zielunabhängiger Durchlauf die Umwandlung rückgängig macht. Dies wird im LLVM-Sprachgebrauch als "MI" -Pass bezeichnet. Als Beispiel können Sie in X86FixupSetCC.cpp (mirror here) suchen. Dies hat den großen Vorteil, dass Sie es hinter einem Flag platzieren können und andernfalls steuern, ob es auftritt, sobald Sie die Kernfunktionalität hinzufügen. Instruktionstabellen für LLVM im X86 .td files nur definieren diese Anweisungen für 8-Bit-Register

  2. Sie LLVM die ändern können, und fügen Sie dann die def Pat<...>; Muster an die .td Dateien, die Programme mit breiter Vergleiche erlauben noch ihre Befehle ausgewählt haben (so wie Colin es oben vorgeschlagen hat). Dies hat den Nachteil, dass Sie nicht nur Ihren LLVM modifiziert haben, sondern diese Änderungen auch einfach hinter einer Flagge ein- und ausschalten können.

Sie können nichts zu LLVM IR tun, die wirklich hier helfen, weil der Code-Generator wird nur Dinge optimieren zurück in die Befehlsmuster zu vermeiden Sie versuchen.

Hoffe, das hilft!