При сравнении с 32-разрядным набором команд ARM набор 16-разрядных команд большого пальца (не говоря уже о расширениях большого пальца2) занимает меньше места, потому что инструкции имеют половину размера, но в целом это падение производительности, требуется больше инструкций, чтобы сделать то же самое, что и на руке. В набор команд меньше функций, и большинство инструкций работают только с регистрами r0-r7. Сравнение Яблок с Яблоком больше инструкций для выполнения того же самого действия медленнее.
Теперь thumb2 extensions принимает ранее не заданные инструкции большого пальца и создает 32-битные указатели большого пальца. Поймите, что существует несколько наборов расширений большого пальца. ARMv6m добавляет пару дюжин, возможно. ARMv7m добавляет что-то вроде 150 инструкций к набору команд большого пальца, я не знаю, что такое ARMv8 или будущее. Таким образом, предполагая ARMv7m, они преодолели разрыв между тем, что вы можете делать большим пальцем, и тем, что вы можете сделать в ARM. Таким образом, thumb2 является уменьшенным набором команд ARM как большой палец, но не таким уменьшенным. Таким образом, может потребоваться больше инструкций, чтобы сделать то же самое в thumb2 (предположим плюс большой палец) по сравнению с ARM, делающим то же самое.
Это дает представление о проблеме, одной инструкции в руке и ее эквиваленте в большом пальце.
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}
Теперь компилятор не сделал бы это, компилятор будет знать, что это нацеливание большого пальца и сделать что-то по-другому, выбирая другие регистры. Вы все еще меньше регистров и меньше возможностей в соответствии с инструкцией:
mov r0,r1
and r0,r2
Тем не менее занимает две команды/циклов выполнения к и два регистра вместе, не изменяя операнды, и поместить результат в третий регистр. Thumb2 имеет три регистра, и поэтому вы возвращаетесь к одной инструкции с помощью расширений thumb2. И эта команда thumb2 позволяет r0-r15 в любом из этих трех регистров, где большой палец ограничен r0-r7.
Посмотрите на Справочное руководство по архитектуре ARMv5, под каждой инструкцией большого пальца отображается эквивалентная инструкция ARM. Затем перейдите к этой инструкции ARM и сравните то, что вы можете сделать с этой инструкцией, которую вы не можете сделать с помощью инструкции большого пальца. Это односторонний путь, в котором указатели большого пальца (не thumb2) имеют отношение «один к одному» с инструкцией ARM.все указатели большого пальца имеют эквивалентную инструкцию руки. но не все инструкции для рук имеют эквивалентную инструкцию большого пальца. Вы должны уметь видеть из этого упражнения ограничение на компиляторы при использовании набора инструкций большого пальца. Затем получите ARMv7m Architectural Reference Manual и посмотрите на набор команд и сравните кодировки «все варианты большого пальца» (те, которые включают ARMv4T), и те, которые ограничены ARMv6 и/или v7, и видят расширение функций между большим пальцем и thumb2, а также указатели большого пальца2, которые не имеют ни малейшего аналога. Это должно разъяснить, что компиляторы должны работать с большим и большим пальцем2. Вы можете пойти так далеко, чтобы сравнить палец + большой палец2 с полностью раздутыми инструкциями ARM (ARMv7 AR - это то, что он называется?). И посмотрите, что thumb2 намного ближе к ARM, но вы теряете, например, условные выражения для каждой команды, поэтому условное выполнение в палец становится сопоставлением с разветвлением над кодом, где в ARM иногда может быть if-then-else без разветвления. .
Производительность всегда относительна. Существует много случаев, когда код 'thumb' работает лучше, чем' arm'. В основном, если шина памяти является горлышком бутылки. Как правило, 'thumb' не имеет такого количества регистров, поэтому, хотя набор команд более компактен, с некоторыми алгоритмами, ему придется чаще обращаться к памяти, чтобы разливать регистры. –
Если у меня есть грузовик A и грузовик B, который составляет половину от размера A. Если количество поставляемого материала соответствует грузовику A, но оно два больших для грузовика B, то он возьмет грузовик B в два раза больше поездок, чтобы сделать та же самая работа. Thumb не так эффективен, как ARM, это больше похоже на 10-15% больше инструкций, чтобы сделать то же самое, что и ARM. –
См. Также: [Gcc -mthumb vs -marm] Stackoverflow (http://stackoverflow.com/questions/11062936/gcc-mthumb-against-marm) и [Аризонская бумага] (http: //www.cs.arizona .edu/~ arvind/papers/lctes02.pdf) на компиляторах Thumb и ARM. –