Im Vergleich zum 32-Bit-ARM-Befehlssatz benötigt der Daumen-16-Bit-Befehlssatz (noch nicht von thumb2-Erweiterungen gesprochen) weniger Speicherplatz, da die Anweisungen halb so groß sind Es braucht mehr Anweisungen, um das gleiche wie am Arm zu tun. Es gibt weniger Merkmale für den Befehlssatz, und die meisten Befehle arbeiten nur mit den Registern r0-r7. Äpfel zu Äpfel Vergleich mehr Anweisungen, um das gleiche zu tun, ist langsamer.
Nun nehmen thumb2 extensions ehemals undefined thumb Anweisungen und erstellen 32-Bit-Daumen-Anweisungen. Verstehen Sie, dass es mehr als einen Satz von thumb2-Erweiterungen gibt. ARMv6m fügt vielleicht ein paar Dutzend hinzu. ARMv7m fügt dem Daumenbefehlssatz etwas wie 150 Anweisungen hinzu, ich weiß nicht, was Armv8 oder die Zukunft halten. ARMv7m vorausgesetzt, haben sie die Lücke zwischen dem, was Sie mit dem Daumen machen können, und dem, was Sie in ARM machen können, überbrückt. So ist Daumen2 ein reduzierter ARM-Befehlssatz wie Daumen, aber nicht so reduziert. Es kann also immer noch mehr Anweisungen geben, um dasselbe in thumb2 (angenommen plus Daumen) zu machen, im Vergleich zu ARM, das dasselbe macht.
Dies gibt einen Vorgeschmack auf das Problem, eine einzelne Anweisung in Arm und seine Entsprechung in Daumen.
ARM
and r8,r9,r10
THUMB
push {r0,r1}
mov r0,r8
mov r1,r9
and r0,r1
mov r1,r10
and r0,r1
mov r8,r0
pop {r0,r1}
Jetzt ein Compiler würde nicht das tun, würde der Compiler weiß, dass es durch die Wahl anderer Register Daumen und tun Dinge anders ausgerichtet ist. Sie haben noch weniger Register und weniger Funktionen pro Befehl:
mov r0,r1
and r0,r2
nimmt noch zwei Befehle/Ausführungs-Zyklen und zwei Register zusammen, ohne die Operanden modifiziert, und in einem dritten Register das Ergebnis setzen. Thumb2 hat ein drei Register und so sind Sie zurück zu einer einzigen Anweisung mit den Erweiterungen thumb2. Und dieser thumb2-Befehl ermöglicht r0-r15 für jedes der drei Register, in denen der Daumen auf r0-r7 beschränkt ist.
Sehen Sie sich das ARMv5 Architectural Reference Manual an, unter jeder Daumenanweisung sehen Sie den entsprechenden ARM-Befehl. Dann gehen Sie zu dieser ARM-Anweisung und vergleichen Sie, was Sie mit dieser Armanweisung tun können, die Sie mit der Daumenanweisung nicht tun können. Es ist ein Einwegpfad, bei dem die Daumenanweisungen (nicht thumb2) eine Eins-zu-eins-Beziehung mit einer ARM-Anweisung haben.Alle Daumenanweisungen haben eine äquivalente Armanweisung. aber nicht alle Armanweisungen haben eine äquivalente Daumenanweisung. Sie sollten in der Lage sein, aus dieser Übung die Einschränkung der Compiler zu sehen, wenn Sie den Daumen-Befehlssatz verwenden. Holen Sie sich dann das ARMv7m Architectural Reference Manual und schauen Sie sich den Befehlssatz an und vergleichen Sie die "all thumb variants" -Kodierungen (diejenigen, die ARMv4T enthalten) und diejenigen, die auf ARMv6 und/oder v7 beschränkt sind und die Erweiterung von Features zwischen thumb sehen und thumb2 sowie thumb2 nur Anweisungen, die kein Daumen-Gegenstück haben. Dies sollte verdeutlichen, was die Compiler mit Daumen und Daumen zu tun haben2. Sie können dann so weit gehen, um thumb + thumb2 mit den vollen ARM-Anweisungen zu vergleichen (ARMv7 AR ist das, wie es heißt?). Und sehen Sie, dass thumb2 viel näher an ARM kommt, aber Sie verlieren zum Beispiel Conditionals bei jeder Anweisung, so dass bedingte Ausführung in Daumen Vergleiche mit Verzweigungen über Code macht, wo Sie in ARM manchmal ein Wenn-Dann-Else ohne Verzweigung haben können.
Leistung ist immer relativ. Es gibt viele Fälle, in denen der Daumen-Code besser läuft als der Arm. Hauptsächlich wenn der Speicherbus ein Flaschenhals ist. Im Allgemeinen hat der "Daumen" nicht so viele Register, so dass, obwohl der Befehlssatz kompakter ist, er mit einigen Algorithmen häufiger auf Spei cherregister zugreifen muss. –
Wenn ich einen Lieferwagen A und einen Lieferwagen B habe, der halb so groß wie A ist. Wenn die gelieferte Menge in LKW A passt, aber zwei für LKW B groß ist, wird LKW B doppelt so viele Fahrten machen der gleiche Job. Thumb ist nicht halb so effizient wie ARM, es ist mehr wie 10-15% mehr Anweisungen, um dasselbe wie ARM zu machen. –
Siehe auch: Stackoverflow's [Gcc-mtthumb vs-marm] (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) und [Arizona Papier] (http://www.cs.arizona.com) .edu/~ arvind/papers/lctes02.pdf) auf Thumb- und ARM-geführten Compiles. –