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 для каждой функции.

Другие вопросы по тегам