Оптимизация GCC: использование условных инструкций ARM? - PullRequest
3 голосов
/ 19 апреля 2011

Я смотрю на некоторый код, скомпилированный для iOS в XCode (скомпилированный для ARM с gcc), и, насколько я могу видеть, компилятор никогда не использовал функцию ARM, позволяющую произвольным инструкциям иметь присоединенное к ним условие,но вместо этого всегда выполняется переход на условие, как это было бы в случае Intel и других архитектур.

Является ли это просто ограничением GCC (я могу понять, что это может быть так: «условие = ветвь» встроено вслишком высокий уровень в архитектуре компилятора, чтобы допустить иное), или есть определенный флаг оптимизации, который необходимо включить, чтобы разрешить компиляцию условных инструкций?

(Очевидно, я ценю, что делаю большие предположения относительногде использование условных инструкций "должно" быть использовано и фактически было бы оптимизацией, но у меня есть опыт программирования более ранних чипов ARM и использования и анализа выходных данных оригинального компилятора ARM C Acorn, поэтому у меня есть приблизительное представление.)

Обновление: ВложивЭто стало возможным благодаря информации, приведенной ниже, и получается:

  • XCode компилируется в режиме Thumb-2, в котором условное выполнение произвольных инструкций недоступно;
  • В некоторых случаяходнако в некоторых случаях он использует инструкцию ITE (if-then-else) для эффективного создания инструкций с условным выполнением.

Ответы [ 2 ]

1 голос
/ 20 апреля 2011

Просмотр некоторой фактической сборки прояснит ситуацию, но я подозреваю, что настройки по умолчанию для компиляции iOS предпочитают генерирование кода Thumb, а не ARM для лучшей плотности кода.Хотя в Thumb32 или Thumb-2 есть псевдо-условные инструкции (поддерживаемые в архитектуре ARMv7 через инструкцию IT), оригинальный Thumb16 имеет только условные ветви.Кроме того, даже в режиме ARM есть некоторые инструкции, которые не могут быть условными (например, многие инструкции NEON используют расширенное пространство кода операции с полем условия, установленным в NV).

0 голосов
/ 24 июня 2011

Да, gcc на самом деле не выдает наиболее оптимальный код WRT условных инструкций. Он хорошо работает в самых простых случаях, но реальный код страдает от некоторых бессмысленных замедлений, которых можно избежать в ASM с ручным кодированием. Просто чтобы дать вам приблизительное представление, я смог получить ускорение в 2 раза для очень низкого уровня графического метода, выполнив логику чтения / записи и копирования в ARM asm вместо кода C, генерируемого gcc. Но имейте в виду, что эта оптимизация того стоит только для наиболее интенсивно используемых частей вашего кода. Чтобы написать хорошо оптимизированный ARM-ассемблер, требуется много работы, так что даже не пытайтесь делать это, если в оптимизации нет реальной выгоды.

Первое, что нужно иметь в виду, это то, что xcode по умолчанию использует режим Thumb, поэтому для генерации asm ARM вам нужно будет добавить опцию -mno-thumb в опции модуля для конкретного файла .c, который будет содержат ARM асм. После того, как ARM-ассемблер начинает поступать, вам нужно условно составить ассемблерные операторы, как указано в ответе на следующий вопрос:

ARM asm вопрос условной компиляции

...