Android использует -mthumb
, потому что он создает более компактный код. Разрядность процессора тут ни при чем.
В обычном наборе инструкций ARM каждая инструкция является 32-битной, и каждая инструкция довольно выразительна (существуют разные инструкции для выполнения множества разных действий). К сожалению, это также означает, что код может быть немного большим, так как каждая отдельная инструкция занимает 4 байта.
Набор инструкций большого пальца был введен для решения этой проблемы - здесь каждая инструкция имеет длину всего 16 бит, поэтому вы можете разместить в два раза больше инструкций в одном и том же пространстве, но, поскольку инструкции короче, различных инструкций не так много. Каждая инструкция по-прежнему работает с 32-битными регистрами и в остальном ведет себя точно так же, как инструкции ARM, поэтому это просто другой, более компактный способ записи (в основном) подмножества инструкций ARM. Из-за ограниченного количества инструкций для большинства вещей требуется немного больше инструкций, чем в режиме ARM. Таким образом, в зависимости от того, что на самом деле делает код, фактическое уменьшение размера кода не составляет ровно 50%. Кроме того, поскольку может быть больше инструкций, чем раньше, он может работать медленнее, чем раньше. (Но поскольку он меньше, он использует меньше кеша инструкций, что, с другой стороны, может повысить производительность.)
На практике код Thumb, как правило, медленнее, чем код ARM, но более компактен, поэтому для кода, где размер имеет большее значение, чем скорость, вы должны использовать Thumb.
Начиная с Thumb2 (который доступен в ARMv7), в наборе инструкций Thumb немного больше выразительности, поэтому разница в производительности меньше — поэтому он включен по умолчанию в Android — почти во всех случаях он уменьшает размер кода без существенного влияния представление. Если у вас есть действительно критичный к производительности код, вы можете протестировать его, чтобы увидеть, вредит ли он вам или помогает. (Для сборки с помощью ndk-build и Android.mk проверьте переменную LOCAL_ARM_MODE.)
Если вы создаете код вручную, вы можете выбрать, добавить ли вы -mthumb
или -marm
, и, насколько мне известно, вам не нужны дополнительные параметры взаимодействия, независимо от того, какой из них вы выберете.
person
mstorsjo
schedule
08.09.2014