Wie kann ich gcc
anweisen, idiv
(Ganzzahldivision, udiv
und sdiv
) Anweisungen für arm application processors
?
Bisher kann ich nur -mcpu=cortex-a15
mit gcc 4.7 verwenden.
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.
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?
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.
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%