iPhone Thumb & VFP
Как соотносятся коды "compile for Thumb" и VFP?
на iPhone 2G/3G я знаю, что набор инструкций Thumb не включает вычисления с плавающей запятой (на 3GS, по-видимому, Thumb2 имеет…). Так что же произойдет, если кто-то скомпилирует для большого пальца, но использует код VFP для вычислений с плавающей запятой?
я знаю, что это довольно глубоко - но, вероятно, кто-то здесь знает... с
1 ответ
Я не уверен, что вы подразумеваете под "использовать код VFP". Вы имеете в виду код с плавающей запятой, который может быть скомпилирован для запуска на VFP, или вы имеете в виду настоящие инструкции по сборке VFP?
Если вы компилируете в режиме большого пальца и используете с плавающей запятой, вызов функции будет выполняться для каждой операции с плавающей запятой в вашем коде. Эти вызовы функций (они будут иметь имена, такие как __muldf3vfp
) переключить режим в режим ARM, переместить данные в регистры с плавающей запятой, выполнить операцию, переместить данные обратно в целочисленные регистры и вернуться. Это большая работа для чего-то, что является всего лишь одной инструкцией, если вы компилируете в режиме ARM, так что не используйте большой палец в плавающем коде.
Если вы попытаетесь использовать инструкции по сборке VFP в режиме большого пальца, вы просто получите ошибку ассемблера.
Как вы заметили, 3GS поддерживает thumb2, который имеет доступ к регистрам VFP и NEON, поэтому эта ситуация не применима.
Также обратите внимание, что переключение между большим пальцем и ARM-компиляцией может быть выполнено для каждого исходного файла, так что вы можете скомпилировать большую часть вашего проекта большим пальцем и использовать ARM для нескольких подпрограмм, которые выполняют много операций с плавающей запятой, например. Если вы хотите написать ассемблерный код, вы можете переключаться между ARM и thumb для каждой функции.