GCC zum Ausgeben von ARM-Anweisungen

9

Wie kann ich gcc anweisen, idiv (Ganzzahldivision, udiv und sdiv ) Anweisungen für arm application processors ?

auszugeben

Bisher kann ich nur -mcpu=cortex-a15 mit gcc 4.7 verwenden.

%Vor%

Auf gcc 4.7 (gebündelt mit Android NDK r8e )

%Vor%

Auch dieser gibt idiv.c:1:0: warning: switch -mcpu=cortex-a15 conflicts with -march=armv7-a switch [enabled by default] , wenn Sie -march=armv7-a neben -mcpu=cortex-a15 hinzufügen und nicht idiv Anweisung ausgeben.

%Vor%

Auf gcc 4.6 (gebündelt mit Android NDK r8e) gibt es überhaupt keine idiv -Anweisungen aus, sondern erkennt, dass -mcpu=cortex-a15 auch nicht auf -mcpu=cortex-a15 -march=armv7-a combination klagt.

Afaik idiv ist optional auf armv7 , also sollte es eine sauberere Methode geben, gcc zu befehlen, sie zu senden, aber wie?

    
auselen 03.04.2013, 08:12
quelle

1 Antwort

5

Wenn der Befehl nicht in den Maschinenbeschreibungen enthalten ist, bezweifle ich, dass gcc Code ausgibt. Anmerkung1

Sie können immer inline-assembler verwenden, um die Anweisung zu erhalten, wenn der Compiler sie nicht unterstützt. Note2 Da Ihre op-code ziemlich selten / maschinenspezifisch ist, gibt es dort ist wahrscheinlich nicht so viel Aufwand, um es in der gcc Quelle zu bekommen. Insbesondere gibt es arch und tune / cpu Flags. Die tune / CPU ist für eine spezifischere Maschine gedacht, aber der arch soll alle Maschinen in dieser Architektur zulassen. Diese op-code scheint diese Regel zu brechen, wenn ich das verstehe.

Für gcc 4.6.2 sieht es so aus, als wären thumb2 und cortex-r4 Hinweise, um diese Anweisungen zu verwenden und wie Sie es mit gcc 4.7 bemerkt haben. 2, scheint der cortex-a15 hinzugefügt zu werden, um diese Anweisungen zu verwenden. Mit gcc 4.7.2 hat die Datei thumb2.md nicht mehr udiv / sdiv . Es könnte jedoch irgendwo anders enthalten sein; Ich bin mit der Maschinenbeschreibung Sprache nicht 100% vertraut. Es scheint auch, dass cortex-a7 , cortex-a15 und cortex-r5 diese Anweisungen mit 4.7.2 aktivieren können. Note3

Dies beantwortet die Frage nicht direkt, aber es gibt einige Informationen / Pfad, um die Antwort zu erhalten. Sie können das Modul mit -mcpu=cortex-r4 kompilieren, obwohl dies Linkprobleme verursachen kann. Außerdem gibt es int my_idiv(int a, int b) __attribute__ ((__target__ ("arch=cortexe-r4"))); , wobei Sie für jede Funktion die vom Codegenerator verwendete Maschinenbeschreibung angeben können. Ich habe selbst nichts davon benutzt, aber es sind nur Möglichkeiten, es zu versuchen. Im Allgemeinen möchten Sie nicht die falsche Maschine behalten, da sie suboptimale (und möglicherweise illegale) Op-Codes generieren könnte. Sie müssen experimentieren und dann vielleicht die echte Antwort geben.

Anmerkung1: Dies ist für eine Aktie gcc 4.6.2 und 4.7.2. Ich weiß nicht, ob dein Android-Compiler Patches enthält.

%Vor% %Vor%

Anmerkung2: Siehe Preprozessor als Assembler wenn gcc Optionen an gas übergibt, die die Verwendung der udiv/sdiv -Anweisungen verhindern. Zum Beispiel können Sie asm(" .long <opcode>\n"); verwenden, wobei Opcode ein Token ist, der in die Stringed-Register-Codier-Makroausgabe eingefügt wird. Außerdem können Sie Ihren Assembler mit Anmerkungen versehen, um Änderungen in machine anzugeben. Sie können also vorübergehend lügen und sagen, Sie hätten ein cortex-r4 , usw.

Anmerkung3:

%Vor%     
artless noise 03.04.2013, 13:44
quelle

Tags und Links